Что касается динамического SQL в SQL Server, он не проверяет разрешения при использовании динамического SQL - PullRequest
4 голосов
/ 28 февраля 2011

Что такое динамический SQL?

Я прочитал в книге, что когда мы используем динамический SQL, SQL проверяет разрешения. Но когда мы его не используем, тогда нет проверки прав доступа. Почему так?

Я сделал хранимую процедуру, которая обновляет таблицу.

create proc steve_SP AS update steveTABLE set eid = 2 where ename = 'henry'

ВЛАДЕЛЕЦ steve_SP & steveTABLE - STEVE.

Я дал разрешение новому пользователю 'Bob' на выполнение steve_SP, но не получил никакого разрешения для steveTABLE.

Теперь, когда Боб выполняет процедуру, она выполняется успешно.

Но при изменении кода процедуры (используется динамический SQL) на код ниже.

create proc steve_SP AS EXECUTE (update steveTABLE set eid = 2 where ename = 'henry' )

И тогда Боб выполняет процедуру. На этот раз выполнение steve_SP FAILS. Почему так?

1 Ответ

3 голосов
/ 28 февраля 2011

Процедуры - это способ управления доступом к таблице.

Вы можете запретить пользователю все пути доступа к таблице - кроме как через хранимые процедуры DML - поэтому имеет смысл, что CRUD внутри процедур будет работатьгде обычный CRUD не будет работать для пользователя.

Однако, когда вы запускаете динамический SQL, он фактически запускается в отдельном SPID (процессе), таким образом, как если бы пользователь выполнял код вдинамический SQL в новом окне запросов.

Следовательно, первый сценарий:

create proc steve_SP AS update steveTABLE set eid = 2 where ename = 'henry'

Пользователь выполняет steve_SP - что внутренне делает обновление -> OK

Второе:

create proc steve_SP AS
EXECUTE ('update steveTABLE set eid = 2 where ename = ''henry''')

У пользователя есть доступ к steve_SP, поэтому он работает.Там есть запускается EXECUTE, который запускает и запускает это в другом процессе:

update steveTABLE set eid = 2 where ename = 'henry'

Обновить напрямую?-> нет.Вы можете использовать опции WITH EXECUTE AS , чтобы обойти это.

...