Процедуры - это способ управления доступом к таблице.
Вы можете запретить пользователю все пути доступа к таблице - кроме как через хранимые процедуры 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 , чтобы обойти это.