EXECUTE AS, предложение (Transact-SQL)EXECUTE AS Clause (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

В SQL ServerSQL Server можно определять контекст выполнения для следующих определяемых пользователем модулей: функций (за исключением встроенных функций с табличным значением), процедур, очередей и триггеров.In SQL ServerSQL Server you can define the execution context of the following user-defined modules: functions (except inline table-valued functions), procedures, queues, and triggers.

Указывая контекст, в котором выполняется модуль, можно управлять тем, какую учетную запись компонента Компонент Database EngineDatabase Engine использует при проверке разрешений на объекты, на которые ссылается модуль.By specifying the context in which the module is executed, you can control which user account the Компонент Database EngineDatabase Engine uses to validate permissions on objects that are referenced by the module. Это повышает гибкость и безопасность управления разрешениями на цепочки владения между пользовательскими модулями и объектами, на которые они ссылаются.This provides additional flexibility and control in managing permissions across the object chain that exists between user-defined modules and the objects referenced by those modules. Тогда пользователям необходимо будет предоставлять только разрешения на сам модуль, без выдачи явных разрешений на объекты, на которые он ссылается.Permissions must be granted to users only on the module itself, without having to grant them explicit permissions on the referenced objects. Только пользователь, от имени которого выполняется модуль, должен будет иметь разрешения на объекты, к которым этот модуль обращается.Only the user that the module is running as must have permissions on the objects accessed by the module.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- SQL Server Syntax  
Functions (except inline table-valued functions), Stored Procedures, and DML Triggers  
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }   
  
DDL Triggers with Database Scope  
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }   
  
DDL Triggers with Server Scope and logon triggers  
{ EXEC | EXECUTE } AS { CALLER | SELF | 'login_name' }   
  
Queues  
{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }   
  
-- Azure SQL Database Syntax  
Functions (except inline table-valued functions), Stored Procedures, and DML Triggers  
  
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }   
  
DDL Triggers with Database Scope  
  
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }  
  

АргументыArguments

CALLERCALLER
Указывает, что инструкции, содержащиеся в модуле, выполняются в контексте пользователя, вызывающего этот модуль.Specifies the statements inside the module are executed in the context of the caller of the module. Пользователь, выполняющий модуль, должен иметь соответствующие разрешения не только на сам модуль, но также и на объекты базы данных, на которые имеются ссылки из этого модуля.The user executing the module must have appropriate permissions not only on the module itself, but also on any database objects that are referenced by the module.

Аргумент CALLER является значением по умолчанию для всех модулей, кроме очередей, и работает так же, как и в SQL Server 2005 (9.x)SQL Server 2005 (9.x).CALLER is the default for all modules except queues, and is the same as SQL Server 2005 (9.x)SQL Server 2005 (9.x) behavior.

Ключевое слово CALLER не может быть указано в инструкции CREATE QUEUE или ALTER QUEUE.CALLER cannot be specified in a CREATE QUEUE or ALTER QUEUE statement.

SELFSELF
EXECUTE AS SELF эквивалентно EXECUTE AS user_name, где указанный пользователь — это тот, кто создает или изменяет модуль.EXECUTE AS SELF is equivalent to EXECUTE AS user_name, where the specified user is the person creating or altering the module. Фактический идентификатор пользователя, создающего или изменяющего модуль, хранится в столбце execute_as_principal_id в представлении каталога sys.sql_modules или sys.service_queues.The actual user ID of the person creating or modifying the modules is stored in the execute_as_principal_id column in the sys.sql_modules or sys.service_queues catalog view.

Аргумент SELF является значением по умолчанию для очередей.SELF is the default for queues.

Примечание

Чтобы изменить идентификатор пользователя в execute_as_principal_id представления каталога sys.service_queues, необходимо явно указать аргумент EXECUTE AS в инструкции ALTER QUEUE.To change the user ID of the execute_as_principal_id in the sys.service_queues catalog view, you must explicitly specify the EXECUTE AS setting in the ALTER QUEUE statement.

OWNEROWNER
Указывает, что инструкции, содержащиеся в модуле, выполняются в контексте текущего владельца этого модуля.Specifies the statements inside the module executes in the context of the current owner of the module. Если для модуля не определен владелец, то подразумевается владелец схемы модуля.If the module does not have a specified owner, the owner of the schema of the module is used. Ключевое слово OWNER не может указываться для триггеров DDL или триггеров входа.OWNER cannot be specified for DDL or logon triggers.

Важно!

OWNER должен быть сопоставлен с негрупповой учетной записью и не может быть ролью или группой.OWNER must map to a singleton account and cannot be a role or group.

' user_name '' user_name '
Указывает, что инструкции, содержащиеся в модуле, выполняются в контексте пользователя, указываемого аргументом user_name.Specifies the statements inside the module execute in the context of the user specified in user_name. Разрешения на объекты, на которые ссылается модуль, проверяются для user_name.Permissions for any objects within the module are verified against user_name. Аргумент user_name нельзя указывать для триггеров DDL в области сервера или триггеров входа.user_name cannot be specified for DDL triggers with server scope or logon triggers. Вместо него следует использовать login_name.Use login_name instead.

Аргумент user_name должен присутствовать в текущей базе данных и не должен относиться к учетной записи группы.user_name must exist in the current database and must be a singleton account. В качестве аргумента user_name не могут быть указаны роль, сертификат, ключ или встроенная учетная запись (например, NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService или NT AUTHORITY\LocalSystem).user_name cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

Идентификатор пользователя контекста выполнения хранится в метаданных, его можно получить из столбца execute_as_principal_id представления каталога sys.sql_modules или sys.assembly_modules.The user ID of the execution context is stored in metadata and can be viewed in the execute_as_principal_id column in the sys.sql_modules or sys.assembly_modules catalog view.

' login_name '' login_name '
Указывает, что инструкции, содержащиеся в модуле, выполняются в контексте имени входа SQL ServerSQL Server, указанного в аргументе login_name.Specifies the statements inside the module execute in the context of the SQL ServerSQL Server login specified in login_name. Разрешения на объекты, на которые ссылается модуль, проверяются для login_name.Permissions for any objects within the module are verified against login_name. Аргумент login_name можно указывать только для триггеров DDL в области сервера или триггеров входа.login_name can be specified only for DDL triggers with server scope or logon triggers.

В качестве аргумента login_name не могут быть указаны роль, сертификат, ключ или встроенная учетная запись (например, NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService или NT AUTHORITY\LocalSystem).login_name cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

RemarksRemarks

Способ, которым компонент Компонент Database EngineDatabase Engine определяет разрешения на объекты, зависит от цепочки владения, связывающей модуль и объекты, на который он ссылается.How the Компонент Database EngineDatabase Engine evaluates permissions on the objects that are referenced in the module depends on the ownership chain that exists between calling objects and referenced objects. В предыдущих версиях SQL ServerSQL Server цепочки владения были единственным методом, который позволял избежать предоставления пользователю разрешений на все объекты, к которым модуль производит доступ.In earlier versions of SQL ServerSQL Server, ownership chaining was the only method available to avoid having to grant the calling user access to all referenced objects.

Цепочки владения имеют следующие ограничения.Ownership chaining has the following limitations:

  • Применяются только к следующим инструкциям DML: SELECT, INSERT, UPDATE и DELETE.Applies only to DML statements: SELECT, INSERT, UPDATE, and DELETE.

  • У вызывающего и вызываемого объекта должен быть один и тот же владелец.The owners of the calling and the called objects must be the same.

  • Не применяются к динамическим запросам в модуле.Does not apply to dynamic queries inside the module.

Независимо от контекста выполнения, указанного в модуле, всегда выполняются следующие действия.Regardless of the execution context that is specified in the module, the following actions always apply:

  • Компонент Компонент Database EngineDatabase Engine сначала проверяет, имеет ли пользователь, выполняющий модуль, разрешение EXECUTE на него.When the module is executed, the Компонент Database EngineDatabase Engine first verifies that the user executing the module has EXECUTE permission on the module.

  • Применяются правила цепочки владения,Ownership chaining rules continue to apply. то есть если вызывающий и вызываемый объекты имеют одного и того же владельца, разрешения на вложенные объекты не проверяются.This means if the owners of the calling and called objects are the same, no permissions are checked on the underlying objects.

Если пользователь выполняет модуль, для которого определен запуск в контексте, отличном от CALLER, проверяются разрешения пользователя на выполнение модуля, а проверки разрешений на объекты, к которым модуль производит доступ, выполняются для учетной записи пользователя, указанной в предложении EXECUTE AS.When a user executes a module that has been specified to run in a context other than CALLER, the user's permission to execute the module is checked, but additional permissions checks on objects that are accessed by the module are performed against the user account specified in the EXECUTE AS clause. Пользователь, выполняющий модуль, таким образом олицетворяет указанного пользователя.The user executing the module is, in effect, impersonating the specified user.

Контекст, указанный в предложении EXECUTE AS, действует только до конца выполнения модуля,The context specified in the EXECUTE AS clause of the module is valid only for the duration of the module execution. после чего производится возврат в исходный контекст.Context reverts to the caller when the module execution is completed.

Указание имени пользователя или имени входаSpecifying a User or Login Name

Пользователь базы данных и имя входа сервера, указанные в предложении EXECUTE AS, не могут быть удалены до тех пор, пока модуль не будет изменен так, чтобы он выполнялся в другом контексте.A database user or server login specified in the EXECUTE AS clause of a module cannot be dropped until the module has been modified to execute under another context.

Имя пользователя или имя входа, указанное в предложении EXECUTE AS, должно присутствовать в качестве участника в sys.database_principals или sys.server_principals соответственно; в противном случае операция создания или изменения модуля завершается ошибкой.The user or login name specified in EXECUTE AS clause must exist as a principal in sys.database_principals or sys.server_principals, respectively, or else the create or alter module operation fails. К тому же пользователь, который создает или изменяет модуль, должен иметь разрешение IMPERSONATE на этого участника.Additionally, the user that creates or alters the module must have IMPERSONATE permissions on the principal.

Если пользователь неявно имеет доступ к базе данных или экземпляру SQL ServerSQL Server через членство в группе Windows, то пользователь, указанный в предложении EXECUTE AS, неявно создается в момент создания модуля при соблюдении следующих условий.If the user has implicit access to the database or instance of SQL ServerSQL Server through a Windows group membership, the user specified in the EXECUTE AS clause is implicitly created when the module is created when one of the following requirements exist:

  • Указанный пользователь или имя входа является членом предопределенной роли сервера sysadmin.The specified user or login is a member of the sysadmin fixed server role.

  • Пользователь, который создает модуль, имеет разрешение на создание участников.The user that is creating the module has permission to create principals.

Если какое-либо из этих условий не соблюдается, операция создания модуля завершается ошибкой.When neither of these requirements are met, the create module operation fails.

Важно!

Если служба SQL ServerSQL Server (MSSQLSERVER) выполняется от имени локальной учетной записи (локальной службы или локального пользователя), она не будет иметь прав на членство в группах домена Windows, которые могут быть указаны в предложении EXECUTE AS.If the SQL ServerSQL Server (MSSQLSERVER) service is running as a local account (local service or local user account), it will not have privileges to obtain the group memberships of a Windows domain account that is specified in the EXECUTE AS clause. Это приведет к ошибке выполнения модуля.This will cause the execution of the module to fail.

Для примера рассмотрим следующие условия.For example, assume the following conditions:

  • Группа CompanyDomain\SQLUsers имеет доступ к базе данных Sales.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1 является членом SQLUsers и, таким образом, имеет доступ к базе данных Sales.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has access to the Sales database.

  • Пользователь, который создает модуль, имеет разрешение на создание участников.The user that is creating or altering the module has permissions to create principals.

Когда следующее выражение CREATE PROCEDURE выполняется, выражение CompanyDomain\SqlUser1 безоговорочно создается в качестве базы данных субъекта в базе данных Sales .When the following CREATE PROCEDURE statement is run, the CompanyDomain\SqlUser1 is implicitly created as a database principal in the Sales database.

USE Sales;  
GO  
CREATE PROCEDURE dbo.usp_Demo  
WITH EXECUTE AS 'CompanyDomain\SqlUser1'  
AS  
SELECT user_name();  
GO  

Использование EXECUTE AS CALLER в качестве изолированной инструкцииUsing EXECUTE AS CALLER Stand-Alone Statement

EXECUTE AS CALLER можно выполнять в модуле в качестве изолированной инструкции для переключения контекста на пользователя, вызывающего модуль.Use the EXECUTE AS CALLER stand-alone statement inside a module to set the execution context to the caller of the module.

Рассмотрим следующую хранимую процедуру под названием SqlUser2.Assume the following stored procedure is called by SqlUser2.

CREATE PROCEDURE dbo.usp_Demo  
WITH EXECUTE AS 'SqlUser1'  
AS  
SELECT user_name(); -- Shows execution context is set to SqlUser1.  
EXECUTE AS CALLER;  
SELECT user_name(); -- Shows execution context is set to SqlUser2, the caller of the module.  
REVERT;  
SELECT user_name(); -- Shows execution context is set to SqlUser1.  
GO  

Применение EXECUTE AS для определения пользовательских наборов разрешенийUsing EXECUTE AS to Define Custom Permission Sets

Выбор контекста выполнения в модуле может оказаться полезным в тех случаях, когда необходимо определить пользовательский набор разрешений.Specifying an execution context for a module can be very useful when you want to define custom permission sets. Для некоторых действий (например, TRUNCATE TABLE) соответствующие разрешения не реализованы.For example, some actions, such as TRUNCATE TABLE, do not have grantable permissions. Включив инструкцию TRUNCATE TABLE в модуль и определив выполнение этого модуля от имени пользователя, который имеет разрешение на изменение таблицы, можно передавать возможность усечения таблицы другим пользователям, предоставляя им разрешение EXECUTE на этот модуль.By incorporating the TRUNCATE TABLE statement within a module and specifying that module execute as a user who has permissions to alter the table, you can extend the permissions to truncate the table to the user to whom you grant EXECUTE permissions on the module.

Для просмотра определения модуля вместе с указанием контекста выполнения воспользуйтесь представлением каталога sys.sql_modules (Transact-SQL).To view the definition of the module with the specified execution context, use the sys.sql_modules (Transact-SQL) catalog view.

РекомендацииBest Practice

Указывайте имя входа или пользователя, имеющего минимальные права на выполнение операций, определенных в модуле.Specify a login or user that has the least privileges required to perform the operations defined in the module. Например, указывайте учетную запись владельца базы данных только тогда, когда разрешения, которыми он обладает, действительно необходимы.For example, do not specify a database owner account unless those permissions are required.

РазрешенияPermissions

Для выполнения модуля с указанным предложением EXECUTE AS пользователь должен иметь разрешение EXECUTE на модуль.To execute a module specified with EXECUTE AS, the caller must have EXECUTE permissions on the module.

Для выполнения указанного с предложением EXECUTE AS модуля CLR, который производит доступ к ресурсам в другой базе данных или на другом сервере, целевым сервером или базой данных должно быть выдано удостоверение проверки подлинности для базы данных, в которой находится модуль (т.е. базы данных-источника).To execute a CLR module specified with EXECUTE AS that accesses resources in another database or server, the target database or server must trust the authenticator of the database from which the module originates (the source database).

Для указания предложения EXECUTE AS при создании или изменении модуля необходимо разрешение IMPERSONATE на указанного участника, а также разрешение на создание модуля.To specify the EXECUTE AS clause when you create or modify a module, you must have IMPERSONATE permissions on the specified principal and also permissions to create the module. Пользователь всегда может олицетворять сам себя.You can always impersonate yourself. Если контекст выполнения не указан или указано EXECUTE AS CALLER, разрешение IMPERSONATE не требуется.When no execution context is specified or EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

Для указания login_name или user_name, которые неявно имеют доступ к базе данных посредством членства в группе Windows, требуется разрешение CONTROL в базе данных.To specify a login_name or user_name that has implicit access to the database through a Windows group membership, you must have CONTROL permissions on the database.

ПримерыExamples

В следующем примере создается хранимая процедура в базе данных AdventureWorks2012AdventureWorks2012, которой затем назначается контекст выполнения OWNER.The following example creates a stored procedure in the AdventureWorks2012AdventureWorks2012 database and assigns the execution context to OWNER.

CREATE PROCEDURE HumanResources.uspEmployeesInDepartment   
@DeptValue int  
WITH EXECUTE AS OWNER  
AS  
    SET NOCOUNT ON;  
    SELECT e.BusinessEntityID, c.LastName, c.FirstName, e.JobTitle  
    FROM Person.Person AS c   
    INNER JOIN HumanResources.Employee AS e  
        ON c.BusinessEntityID = e.BusinessEntityID  
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh  
        ON e.BusinessEntityID = edh.BusinessEntityID  
    WHERE edh.DepartmentID = @DeptValue  
    ORDER BY c.LastName, c.FirstName;  
GO  
  
-- Execute the stored procedure by specifying department 5.  
EXECUTE HumanResources.uspEmployeesInDepartment 5;  
GO  
  

См. также:See Also

sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.service_queues (Transact-SQL) sys.service_queues (Transact-SQL)
REVERT (Transact-SQL) REVERT (Transact-SQL)
EXECUTE AS (Transact-SQL)EXECUTE AS (Transact-SQL)