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