Использование инструкции EXECUTE AS для создания пользовательских наборов разрешений

Указание контекста выполнения для модуля может быть полезным при определении пользовательских наборов разрешений. Например, для некоторых действий, таких как TRUNCATE TABLE, предоставить разрешения нельзя. Чтобы выполнить инструкцию TRUNCATE TABLE, у пользователя должны быть разрешения ALTER на нужную таблицу. Предоставление разрешений ALTER не всегда подходит, так как фактические разрешения пользователя выходят за пределы возможности усечения таблицы.

Заключив инструкцию TRUNCATE TABLE в модуль и указав, что этот модуль должен выполняться от имени пользователя, у которого есть разрешения на изменение таблицы, можно предоставить разрешение на усечение таблицы пользователю с разрешением EXECUTE для этого модуля.

Рассмотрим следующую хранимую процедуру:

CREATE PROCEDURE TruncateMyTable
WITH EXECUTE AS SELF
AS TRUNCATE TABLE MyDB..MyTable;

Пусть Маша создает эту процедуру и предоставляет разрешения на выполнение TruncateMyTable Саше. Когда Саша выполняет эту процедуру, компонент Database Engine проверяет разрешения на усечение таблицы, как если бы хранимую процедуру выполняла Маша. Так как она владелец таблицы, инструкция выполняется успешно, хотя прямого разрешения на изменение Машиной таблицы у Саши нет. Маша быстро и эффективно предоставила Саше нужные разрешения, ограничив их только теми, что нужны для выполнения конкретной задачи.