Запретить изменение данных хранимой процедуры с помощью безопасности пользователя
Я хочу простой способ сделать пользователя только для чтения в моей базе данных. Пользователь должен иметь разрешение на выполнение хранимых процедур, только если они не изменяют данные. Я не хочу выяснять, какие хранимые процедуры доступны только для чтения, и давать разрешения таким образом, потому что их слишком много, чтобы пройти.
Я думал, что это было возможно после того, как я прочитал следующее:
"Для хранимой процедуры может потребоваться разрешение EXECUTE для хранимой процедуры и разрешение INSERT для нескольких таблиц, на которые ссылается хранимая процедура". - http://technet.microsoft.com/en-us/library/ms191291.aspx
К сожалению, я могу ВЫПОЛНИТЬ "исполняемую" хранимую процедуру, которая ВСТАВЛЯЕТ в пользовательскую таблицу "только для чтения".
2 ответа
Этот комментарий к MSDN просто означает, что в некоторых ситуациях (например, иногда при использовании динамического SQL) предоставление пользователю EXECUTE для хранимой процедуры не обязательно будет достаточным, чтобы позволить ему выполнить ее.
То, что вы хотите, не может быть выполнено - если они смогут запустить хранимую процедуру, они смогут делать то, что делает хранимая процедура - INSERT, DELETE, UPDATE, что угодно. Даже SELECT может вносить изменения через SELECT INTO. И всегда есть временные таблицы или табличные переменные, которые усложняют любые попытки идентифицировать список безопасных / небезопасных sps.
Мой совет - максимально сузить то, что на самом деле должен читать пользователь, доступный только для чтения, создать роль БД с разрешениями EXECUTE только для этих объектов и начать с нее. И я надеюсь, что вы не давали разрешения EXECUTE для роли Public, потому что если это так, вам также нужно будет DENY EXECUTE для всех других хранимых процедур.
К сожалению (насколько я знаю) нет способа сделать это. Предоставление пользователю (даже пользователю, доступному только для чтения) возможности выполнения хранимого процесса означает, что он сможет выполнять все, что находится внутри этого элемента.