Поделиться через


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

Параметр EXECUTE AS можно использовать для определения контекста выполнения следующих пользовательских модулей: функций, процедур, запросов и триггеров. Например, модуль может выполняться в контексте вызывающего пользователя, в контексте владельца модуля или в контексте любого указанного пользователя. В предыдущих версиях SQL Server эти модули всегда выполнялись в контексте вызывающего пользователя.

Указывая контекст выполнения модуля, можно управлять тем, какая учетная запись компонента Database Engine используется для проверки разрешений на объекты, на которые ссылается модуль. Это обеспечивает дополнительную гибкость и управление разрешениями внутри объектной цепочки, которая существует между модулями, определяемыми пользователем и объектами, ссылающимися на эти модули. Пользователям этого модуля требуется только разрешение на его запуск и не требуется никаких явных разрешений на ссылаемые в нем объекты. Только пользователь, от имени которого выполняется модуль, должен обладать разрешениями на объекты, к которым обращается модуль.

EXECUTE AS CALLER

Предложение EXECUTE AS CALLER указывает, что операторы внутри модуля вызываются в контексте вызывающего пользователя.

Используйте предложение EXECUTE AS CALLER в следующих случаях:

  • Если нужно, чтобы инструкции в модуле выполнялись от имени вызывающего пользователя.

  • Если нужно, чтобы в этом модуле была проведена проверка базовых разрешений вызывающего пользователя на инструкции, после чего для обхода проверки разрешений на базовые объекты используются цепочки владения. Помните, что цепочки владения применяются только для DML-инструкций. Дополнительные сведения о цепочках владения см. в разделе Цепочки владения.

  • Если нужно, чтобы приложение не обращалось к базовым объектам, скрытым от пользователя, или необходимо ссылаться только на собственные объекты и рассчитывать на цепочки владения для скрытия схемы от пользователя.

  • Если нужно сохранить поведение SQL Server 2000.

Вариант использования предложения EXECUTE AS CALLER

Мария создает хранимую процедуру, которая ссылается на таблицу, владельцем которой Мария не является, но имеет на нее разрешение SELECT. Она указывает предложение EXECUTE AS CALLER в инструкции CREATE PROCEDURE, как это показано в следующем примере:

CREATE PROCEDURE AccessTable
WITH EXECUTE AS CALLER
AS SELECT * FROM dbo.SomeTable;

Затем Мария предоставляет разрешение EXECUTE на хранимую процедуру Ивану. Когда Иван вызывает хранимую процедуру, компонент Database Engine проверяет наличие у него разрешения на ее вызов. У Ивана есть разрешение EXECUTE, но поскольку Мария не является владельцем таблицы, на которую ссылается хранимая процедура, компонент Database Engine проверит, есть ли у Ивана соответствующие разрешения на данную таблицу. В случае если у Ивана нет таких разрешений, инструкция хранимой процедуры завершится неуспешно.

EXECUTE AS user_name

Предложение EXECUTE AS user_name указывает, что инструкции внутри модуля выполняются в контексте пользователя, указанного в параметре user_name.

Используйте предложение EXECUTE AS user_name в следующих случаях:

  • Если нужно, чтобы инструкции в модуле выполнялись в контексте указанного пользователя.

  • Если нужно отключить цепочки владения (когда модуль обращается к объектам разных владельцев), чтобы скрыть базовую схему и нужно избежать предоставления разрешений на объекты этой схемы.

  • Если нужно создать пользовательский набор разрешений. Например, чтобы предоставлять разрешения на операции DDL, так как эти разрешения обычно нельзя предоставлять. Дополнительные сведения см. в разделе Использование инструкции EXECUTE AS для создания пользовательских наборов разрешений.

    ПримечаниеПримечание

    Пользователя, в контексте которого выполняется модуль, нельзя удалить до тех пор, пока модуль не сменит контекст выполнения.

Вариант использования предложения EXECUTE AS user_name

Мария создает хранимую процедуру, которая ссылается на таблицу, владельцем которой Мария не является, но имеет на нее разрешение SELECT. Она указывает предложение EXECUTE AS 'Mary' в инструкции CREATE PROCEDURE, как это показано в следующем примере:

CREATE PROCEDURE AccessMyTable
WITH EXECUTE AS 'Mary'
AS SELECT * FROM dbo.MyTable;

Мария предоставляет разрешение EXECUTE на хранимую процедуру Ивану. Когда Иван вызывает хранимую процедуру, компонент Database Engine проверяет наличие у Ивана разрешения на ее вызов, однако наличие разрешений на используемые объекты проверяется у Марии. В этом случае, несмотря на то, что Иван не обладает разрешениями SELECT на данную таблицу, он может получить доступ к ее данным с помощью этой процедуры, так как Мария, в контексте которой выполняется эта процедура, обладает разрешениями на доступ к данным таблицы.

EXECUTE AS SELF

Предложение EXECUTE AS SELF эквивалентно предложению EXECUTE AS user_name, в котором указанный пользователь является создателем модуля.

Используйте предложение EXECUTE AS SELF в следующих случаях:

  • Если нужно упростить процесс указания себя в качестве пользователя, в контексте которого требуется выполнить код модуля, который был лично создан или изменен.

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

EXECUTE AS OWNER

Предложение EXECUTE AS OWNER указывает, что операторы внутри модуля вызываются в контексте владельца модуля. Если у модуля нет владельца, им становится владелец схемы модуля.

Используйте предложение EXECUTE AS OWNER в следующем случае:

  • если нужно иметь возможность изменить владельца модуля без внесения изменений в его код. Таким образом, параметр OWNER автоматически сопоставляется с текущим владельцем модуля во время выполнения.

Параметр OWNER — это явный владелец модуля или, если явный владелец не указан, владелец схемы модуля во время его выполнения. Параметр OWNER должен быть одиночной учетной записью, а не группой или ролью. Нельзя сменить владельца модуля на группу или роль, пока модуль выполняется с предложением EXECUTE AS OWNER и имеет явно заданного владельца. Нельзя сменить владельца схемы на группу или роль, пока она содержит модуль, выполняемый с предложением EXECUTE AS OWNER, и имеет явно заданного владельца.

Вариант использования предложения EXECUTE AS OWNER

Мария создает хранимую процедуру, которая ссылается на таблицу, владельцем которой является Мария. Она указывает предложение EXECUTE AS OWNER в инструкции CREATE PROCEDURE, как это показано в следующем примере:

CREATE PROCEDURE Mary.AccessMyTable
WITH EXECUTE AS OWNER
AS SELECT * FROM Mary.MyTable;

Мария предоставляет разрешение EXECUTE на хранимую процедуру Ивану. Когда Иван вызывает хранимую процедуру, компонент Database Engine проверяет наличие у Ивана разрешения на ее вызов, однако наличие разрешений на используемые объекты проверяется у Марии, потому что она является текущим владельцем процедуры. Мария решает покинуть компанию и делает Николая владельцем данной хранимой процедуры. Когда Иван вызывает хранимую процедуру после изменения ее владельца, он все еще может получить с ее помощью доступ к данным, так как параметру OWNER автоматически сопоставляется Николай.