Предположим, что мы делаем отчет для пользователя. Данные выбираются из базы данных с помощью хранимой процедуры, а выводятся, например, в Excel. В этом случае приходится давать пользователю прямой доступ к базе. И тут сразу возникает вопрос – как дать доступ только туда, куда нужно.
Варианты следующие:
- Выбираем нужные таблицы и даем пользователю право читать их. Неудобно то, что все нужно будет повторять для каждого отчета и пользователя. Введение специальных ролей тоже не особо поможет, т.к. для каждого отчета набор таблиц обычно разный, плюс со временем может меняться как сам набор таблиц, так и пользователи, которым разрешен запуск отчета.
- Включаем пользователя в роль db_datareader. В этом случае проблем с администрированием почти никаких, но пользователь будет иметь возможность читать все таблицы базы данных. В большинстве случаев политика безопасности предприятия не позволяет делать так.
- Дать пользователю только право запускать хранимую процедуру, а уже внутри процедуры переключить контекст с помощью конструкции EXECUTE AS. В этом случае пользователь не будет иметь никаких избыточных прав, а администрирование сводится только к выдаче прав на конкретную процедуру.
Пример процедуры, реализующей последний вариант:
1: USE iScalaDB2:3: -- создаем новый логин4: CREATE LOGIN ReportUserLogin WITH PASSWORD='ERFss$#45%$'5: GO6:7: -- создаем пользователя, на которого будем переключать контекст8: CREATE USER ReportUser FOR LOGIN ReportUserLogin9: GO10:11: -- даем вспомогательному пользователю право читать всю базу данных12: EXEC sp_addrolemember 'db_datareader','ReportUser'13: GO14:15: -- создаем проверочную процедру16: CREATE PROCEDURE dbo.TestExecuteAS17: WITH EXECUTE AS 'ReportUser'18: AS19: BEGIN20: SET NOCOUNT ON21:22: SELECT *23: FROM GL06010824: END25: GO26:
Конструкция EXECUTE AS появилась в MS SQL2005, в более ранних версиях была команда SETUSER, но она имела ряд ограничений, которые не позволяли использовать ее в нашем сценарии.
Комментариев нет:
Отправить комментарий