2010-11-02 4 views
6

У меня есть база данных, которая имеет роль приложения. Все члены роли принадлежат к группе в Active Directory. Вместо предоставления разрешений роли для выбора из таблиц я предоставил разрешения на выполнение роли для всех хранимых процедур, которые необходимо вызвать.Разрешения SQL Server для хранимых процедур с динамическим SQL

Это работает отлично, за исключением одной из моих хранимых процедур, которая создает некоторый динамический SQL и вызывает sp_executesql.

Динамический SQL выглядит вроде как это:

SET @SQL = N' 
SELECT * 
FROM dbo.uvView1 
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id' 

EXEC sp_executesql @SQL 

Пользователи в этой роли не удается вызвать хранимую процедуру. Он дает следующую ошибку, которая является вроде ожидаемой. Я полагаю:

Разрешение SELECT было отклонено на объект «uvView1», база данных «Foobar», схема «dbo».

Есть ли способ, которым мои пользователи могут успешно выполнить этот процесс без предоставления прав доступа ко всем представлениям в динамическом SQL?

+0

У пользователя есть доступ к этому виду, не так ли? Я не думаю, что безопасность заботится о том, как они к нему обращаются. – JNK

+0

Это единственный проком, который терпит неудачу, и он не терпит неудачу с разрешениями на выполнение proc ... он специально говорит мне, что он может SELECT из представления ... так что я предполагаю, что это имеет какое-то значение. – Dismissile

ответ

6

Да.

Добавить процедуру EXECUTE AS CALLER в процедуру, затем подписать сохраненную процедуру и предоставить необходимое разрешение на подпись . Это на 100% безопасно, безопасно и пуленепробито. См. Signing Procedures with Certificates.

+0

Как насчет решения с использованием триггера базы данных для мониторинга Sql пользователя и отклонения его, если SQL начинается с 'select'? – ca9163d9

0

Нет. Есть ли способ изменить его, чтобы не использовать динамический SQL?

+0

Нет, не знаю, о чем я знаю. Запрос фактически сворачивает некоторые данные, а столбцы, которые он поворачивает, являются динамическими. Мой пример не показывает сложность запроса. – Dismissile

+3

Вы можете рассмотреть возможность размещения всех этих представлений в одной схеме и затем предоставить им доступ к каталогу данных на схеме. –

2

Можете ли вы использовать impersonation в другой ID с необходимыми разрешениями?

SET @SQL = N' 
EXECUTE AS USER = ''TrustedUser''; 
SELECT * 
FROM dbo.uvView1 
INNER JOIN uvView2 ON uvView1.Id = uvView2.Id' 

EXEC sp_executesql @SQL 
+0

Хорошее предложение Я посмотрю, смогу ли я это сделать. – Dismissile

+0

-1: требуется разрешение IMPERSONATE на «TrustedUser», что фактически означает, что пользователь ** имеет ** все разрешения доверенного пользователя, так как он может выдавать себя за него по своему усмотрению. –