Вопрос

У меня есть база данных, которая имеет роль заявки. Все члены роли относятся к группе в 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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top