Вот моя цель: создать логин и связанного пользователя базы данных с разрешениями на выбор (только для чтения) и исключить сохраненные процессы, которые не обновляются.
Немного предыстории заключается в том, что это SQL 2005 и база данных с десятилетней историей и слоями неприятных вещей. Сотни сохраненных процессов, все в схеме dbo. Я знаю...
Я создал свой логин и пользователя и предоставил пользователю права db_datareader. Мне также пришлось предоставить разрешения EXECUTE для запуска любых процессов, но моя цель - запретить любые процессы, которые выполняют какие-либо действия UPDATE / DELETE. Попытка установить пермы индивидуально для этих процедур была бы кошмаром, который я не готов рассматривать.
Возможен ли описываемый мной сценарий?
Если у вас есть логика, инкапсулированная в хранимой процедуре, разрешения на базовые объекты не требуются. Один из способов выполнить то, что вы хотите сделать, - это положить на стол триггер. Что-то вроде:
create trigger tr_del_tbl on tbl after delete as
begin
if user_name() = 'foobar' and exists (select 1 from deleted)
rollback
end
Я бы также использовал для этого роль вместо одного конкретного пользователя. Таким образом, если позже у вас появится другой пользователь, который нуждается в аналогичном лечении, вам не придется изменять триггер; вы просто добавляете их в роли.
Не существует модели на основе разрешений, которая будет делать это, если вы не назначаете права вручную на основе того, что делает хранимая процедура. Ваш единственный выход - это триггеры. Имейте в виду, что это будет работать только в том случае, если не используется EXECUTE AS, который изменил бы способ пользователя, о котором сообщает функция user_name ().