Разрешения SQL Server на сохраненные Procs с динамическим SQL
-
28-09-2019 - |
Вопрос
У меня есть база данных, которая имеет роль заявки. Все члены роли относятся к группе в Active Directory. Вместо того, чтобы дать разрешения роли выбирать из таблиц, которые я дал разрешения для выполнения роли на всех сохраненных процедурах, которые необходимо позвонить.
Это работает нормально, за исключением одной из моих хранимых процедур, которые создают некоторые динамические SQL и вызов SP_EXECUTESQL.
Динамический SQL выглядит как это:
SET @SQL = N'
SELECT *
FROM dbo.uvView1
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id'
EXEC sp_executesql @SQL
Пользователи в этой роли не могут вызвать сохраненную процедуру. Это дает следующую ошибку, которая как ожидается, я полагаю:
Разрешение выбора было отказано в объекте «UVView1», база данных FOOBAR ', схема «DBO».
Есть ли способ, которым я могу успешно выполнить этот ProC, не предоставив разрешения на роль всем представлениям в динамическом SQL?
Решение
да.
Добавьте выполнение в качестве пункта звонящего в процедуру, затем подпишите хранимую процедуру и дайте необходимое разрешение на подпись. Отказ Это 100% безопасным, безопасным и доказательством пули. Видеть Подписание процедур с сертификатами.
Другие советы
Вы можете использовать олицетворение на другой идентификатор с необходимыми разрешениями?
SET @SQL = N'
EXECUTE AS USER = ''TrustedUser'';
SELECT *
FROM dbo.uvView1
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id'
EXEC sp_executesql @SQL
Нет. Есть ли способ изменить его, чтобы не использовать динамический SQL?