Назад | Перейти на главную страницу

Как ограничить права пользователя sql только на чтение, но при этом разрешить выполнение хранимых процедур?

Вот моя цель: создать логин и связанного пользователя базы данных с разрешениями на выбор (только для чтения) и исключить сохраненные процессы, которые не обновляются.

Немного предыстории заключается в том, что это 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 ().