EXECUTE AS (Transact-SQL)EXECUTE AS (Transact-SQL)

Область применения: ДаSQL Server ДаБаза данных SQL Azure ДаAzure Synapse Analytics (Хранилище данных SQL) НетParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database YesAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

Задает контекст выполнения для сеанса.Sets the execution context of a session.

По умолчанию сеанс запускается при входе пользователя в систему и завершается при выходе пользователя из системы.By default, a session starts when a user logs in and ends when the user logs off. Все операции во время сеанса подлежат проверке на наличие у пользователя соответствующих разрешений.All operations during a session are subject to permission checks against that user. При запуске инструкции EXECUTE AS контекст выполнения сеанса переключается на заданное имя входа или имя пользователя.When an EXECUTE AS statement is run, the execution context of the session is switched to the specified login or user name. После переключений контекста имя входа и пользовательские токены безопасности для этой учетной записи проходят проверку на соответствие разрешениям (а не пользователь, вызвавший инструкцию EXECUTE AS).After the context switch, permissions are checked against the login and user security tokens for that account instead of the person calling the EXECUTE AS statement. В сущности, либо входная или пользовательская учетная запись олицетворяется на время сеанса или на время выполнения модуля, либо явно обращается переключение контекста.In essence, the user or login account is impersonated for the duration of the session or module execution, or the context switch is explicitly reverted.

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

СинтаксисSyntax

{ EXEC | EXECUTE } AS <context_specification>  
[;]  
  
<context_specification>::=  
{ LOGIN | USER } = 'name'  
    [ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]   
| CALLER  

АргументыArguments

Имя_для_входаLOGIN
Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

Указывает, что контекст выполнения олицетворения — это имя входа.Specifies the execution context to be impersonated is a login. Область олицетворения — это уровень сервера.The scope of impersonation is at the server level.

Примечание

Этот параметр недоступен в автономной базе данных, базе данных SQL или хранилище данных SQL.This option is not available in a contained database or SQL Database or SQL Data Warehouse.

ПользовательUSER
Определяет контекст для олицетворения пользователя в текущей базе данных.Specifies the context to be impersonated is a user in the current database. Область олицетворения ограничена текущей базой данных.The scope of impersonation is restricted to the current database. При переключении контекста на пользователя базы данных разрешения уровня сервера этого пользователя не наследуются.A context switch to a database user does not inherit the server-level permissions of that user.

Важно!

Пока переключение контекста на пользователя базы данных активно, любая попытка подключиться к ресурсам вне базы данных будет приводить к завершению инструкции с ошибками.While the context switch to the database user is active, any attempt to access resources outside of the database will cause the statement to fail. Это касается инструкций USE database, распределенных запросов, а также запросов, которые ссылаются на другую базу данных, использующую трех- и четырехчастные идентификаторы.This includes USE database statements, distributed queries, and queries that reference another database that uses three- or four-part identifiers.

name — допустимое имя пользователя или имя входа.'name' Is a valid user or login name. Аргумент name должен принадлежать предопределенной роли сервера sysadmin либо быть субъектом в базе данных sys.database_principals или sys.server_principals соответственно.name must be a member of the sysadmin fixed server role, or exist as a principal in sys.database_principals or sys.server_principals, respectively.

name можно задавать как локальную переменную.name can be specified as a local variable.

Аргумент name должен быть одноэлементным и не может быть группой, ролью, сертификатом, ключом или встроенной учетной записью, например NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService или NT AUTHORITY\LocalSystem.name must be a singleton account, and cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

Дополнительные сведения см. в разделе Указание имени пользователя или имени входа далее.For more information, see Specifying a User or Login Name later in this topic.

NO REVERTNO REVERT
Указывает, что переключение контекста нельзя вернуть к предыдущему контексту.Specifies that the context switch cannot be reverted back to the previous context. Параметр NO REVERT можно использовать только на нерегламентированном уровне.The NO REVERT option can only be used at the adhoc level.

Дополнительные сведения о переключении к предыдущему контексту см. в разделе REVERT &(Transact-SQL).For more information about reverting to the previous context, see REVERT (Transact-SQL).

COOKIE INTO @varbinary_variableCOOKIE INTO @varbinary_variable
Указывает, что контекст выполнения можно вернуть к предыдущему контексту, если при вызове инструкция REVERT WITH COOKIE содержит правильное значение @varbinary_variable.Specifies the execution context can only be reverted back to the previous context if the calling REVERT WITH COOKIE statement contains the correct @varbinary_variable value. Компонент Database EngineDatabase Engine передает файл cookie для @varbinary_variable.The Компонент Database EngineDatabase Engine passes the cookie to @varbinary_variable. Параметр COOKIE INTO можно использовать только на нерегламентированном уровне.The COOKIE INTO option can only be used at the adhoc level.

@varbinary_variable — это varbinary(8000) .@varbinary_variable is varbinary(8000).

Примечание

Параметр OUTPUT файла cookie в настоящее время описан в документации как varbinary(8000) , что верно определяет его максимальную длину.The cookie OUTPUT parameter for is currently documented as varbinary(8000) which is the correct maximum length. Однако текущая реализация возвращает параметр varbinary(100) .However the current implementation returns varbinary(100). Для продолжения правильной работы в случае увеличения размера файлов cookie в последующих версиях в приложении должен быть зарезервирован тип varbinary(8000) .Applications should reserve varbinary(8000) so that the application continues to operate correctly if the cookie return size increases in a future release.

CALLERCALLER
При использовании внутри модуля указывает, что инструкции модуля выполняются в контексте вызывающей стороны.When used inside a module, specifies the statements inside the module are executed in the context of the caller of the module. При использовании вне модуля инструкция не действует.When used outside a module, the statement has no action.

Примечание

Этот параметр недоступен в Хранилище данных SQL.This option is not available in SQL Data Warehouse.

RemarksRemarks

Изменение в контексте выполнения продолжает действовать до тех пор, пока не произойдет одно из следующих событий.The change in execution context remains in effect until one of the following occurs:

  • Будет запущена еще одна инструкция EXECUTE AS.Another EXECUTE AS statement is run.

  • Будет запущена инструкция REVERT.A REVERT statement is run.

  • Сеанс удаляется.The session is dropped.

  • Работа хранимой процедуры или триггера, где выполнялась команда, завершается.The stored procedure or trigger where the command was executed exits.

Набор контекстов выполнения может быть создан при помощи нескольких вызовов инструкции EXECUTE AS на нескольких участниках.You can create an execution context stack by calling the EXECUTE AS statement multiple times across multiple principals. При вызове инструкция REVERT производит переключение контекста на имя входа или на пользователя на более высоком уровне стека контекстов.When called, the REVERT statement switches the context to the login or user in the next level up in the context stack. Это показано в разделе Пример А.For a demonstration of this behavior, see Example A.

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

Имя пользователя или имя входа, указанное в инструкции EXECUTE AS <context_specification>, должно быть субъектом в базе данных sys.database_principals или sys.server_principals соответственно, в противном случае инструкция EXECUTE AS будет завершена с ошибками.The user or login name specified in EXECUTE AS <context_specification> must exist as a principal in sys.database_principals or sys.server_principals, respectively, or the EXECUTE AS statement fails. Кроме того, этому участнику должны быть предоставлены разрешения IMPERSONATE.Additionally, IMPERSONATE permissions must be granted on the principal. Если вызывающая сторона не является владельцем базы данных или членом предопределенной роли сервера sysadmin, то субъект должен существовать даже тогда, когда пользователь обращается к базе данных или к экземпляру SQL ServerSQL Server в качестве члена группы Windows.Unless the caller is the database owner, or is a member of the sysadmin fixed server role, the principal must exist even when the user is accessing the database or instance of SQL ServerSQL Server through a Windows group membership. Для примера рассмотрим следующие условия.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 implicit access to the Sales database.

Хотя группа CompanyDomain\SqlUser1 имеет доступ к базе данных посредством членства в группе SQLUsers, инструкция EXECUTE AS USER = 'CompanyDomain\SqlUser1' завершается с ошибкой, потому что CompanyDomain\SqlUser1 не существует в базе данных в качестве субъекта.Although CompanyDomain\SqlUser1 has access to the database through membership in the SQLUsers group, the statement EXECUTE AS USER = 'CompanyDomain\SqlUser1' fails because CompanyDomain\SqlUser1 does not exist as a principal in the database.

Если пользователь утратил связь с учетной записью (соответствующее имя входа больше не существует) и не был создан с параметром WITHOUT LOGIN, попытка этого пользователя выполнить команду EXECUTE AS завершится неудачно.If the user is orphaned (the associated login no longer exists), and the user was not created with WITHOUT LOGIN, EXECUTE AS will fail for the user.

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

Указывайте имя входа или пользователя, который имеет наименьшие права доступа, необходимые для выполнения операций в сеансе.Specify a login or user that has the least privileges required to perform the operations in the session. Например, не указывайте имя входа с разрешениями уровня сервера, если требуются разрешения только уровня базы данных, а также не указывайте учетную запись владельца базы данных, если только эти разрешения не являются обязательными.For example, do not specify a login name with server-level permissions, if only database-level permissions are required; or do not specify a database owner account unless those permissions are required.

Внимание!

Инструкция EXECUTE AS может выполняться успешно, пока компонент Компонент Database EngineDatabase Engine может разрешить имя.The EXECUTE AS statement can succeed as long as the Компонент Database EngineDatabase Engine can resolve the name. Если пользователь в домене существует, Windows может разрешить доступ в компоненте Компонент Database EngineDatabase Engine пользователю, даже если у пользователя Windows отсутствует доступ к SQL ServerSQL Server.If a domain user exists, Windows might be able to resolve the user for the Компонент Database EngineDatabase Engine, even though the Windows user does not have access to SQL ServerSQL Server. Данное обстоятельство может привести к ситуации, когда пользователь, не имеющий доступа к SQL ServerSQL Server, сможет войти в систему, хотя олицетворенное имя входа будет иметь только те разрешения, которые предоставлены пользователю public или guest.This can lead to a condition where a login with no access to SQL ServerSQL Server appears to be logged in, though the impersonated login would only have the permissions granted to public or guest.

Применение WITH NO REVERTUsing WITH NO REVERT

Если инструкция EXECUTE AS содержит необязательное предложение WITH NO REVERT, то контекст выполнения для сеанса нельзя сбросить с помощью инструкции REVERT или путем выполнения другой инструкции EXECUTE AS.When the EXECUTE AS statement includes the optional WITH NO REVERT clause, the execution context of a session cannot be reset using REVERT or by executing another EXECUTE AS statement. Контекст, заданный инструкцией, остается до удаления сеанса.The context set by the statement remains in affect until the session is dropped.

Если указано предложение WITH NO REVERT COOKIE = @varbinary_variable, то Компонент SQL Server Database EngineSQL Server Database Engine передает значение файла cookie в @varbinary_variable.When the WITH NO REVERT COOKIE = @varbinary_variable clause is specified, the Компонент SQL Server Database EngineSQL Server Database Engine passes the cookie value to @varbinary_variable. Контекст выполнения, устанавливаемый данной инструкцией, можно возвратить только к предыдущему контексту, если вызов инструкции REVERT WITH COOKIE = @varbinary_variable содержит то же значение @varbinary_variable.The execution context set by that statement can only be reverted to the previous context if the calling REVERT WITH COOKIE = @varbinary_variable statement contains the same @varbinary_variable value.

Этот параметр может пригодиться в среде с организацией пула соединений.This option is useful in an environment in which connection pooling is used. Организация пула соединений — это поддержка группы подключений к базе данных для повторного использования приложениями или сервером приложений.Connection pooling is the maintenance of a group of database connections for reuse by applications on an application server. Поскольку значение, передаваемое в @varbinary_variable, известно только инициатору инструкции EXECUTE AS, то инициатор может гарантировать, что установленный им контекст выполнения больше никто не сможет изменить.Because the value passed to @varbinary_variable is known only to the caller of the EXECUTE AS statement, the caller can guarantee that the execution context they establish cannot be changed by anyone else.

Определение первоначального имени входаDetermining the Original Login

Функция ORIGINAL_LOGIN возвращает имя входа, которое подключилось к экземпляру SQL ServerSQL Server.Use the ORIGINAL_LOGIN function to return the name of the login that connected to the instance of SQL ServerSQL Server. Можно использовать эту функцию для возврата идентификатора исходного имени входа в сеансах, содержащих множество явных и неявных переключений контекста.You can use this function to return the identity of the original login in sessions in which there are many explicit or implicit context switches.

РазрешенияPermissions

Чтобы указать параметр EXECUTE AS при входе, у вызывающего пользователя должно быть разрешение IMPERSONATE для заданного имени входа и не должно быть запрещено разрешение IMPERSONATE ANY LOGIN.To specify EXECUTE AS on a login, the caller must have IMPERSONATE permission on the specified login name and must not be denied the IMPERSONATE ANY LOGIN permission. Чтобы указать в предложении EXECUTE AS пользователя базы данных, вызывающая сторона должна иметь разрешения IMPERSONATE на указанное имя входа.To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. Если указан параметр EXECUTE AS CALLER, то разрешения IMPERSONATE не являются обязательными.When EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

ПримерыExamples

A.A. Использование предложений EXECUTE AS и REVERT для переключения контекстаUsing EXECUTE AS and REVERT to switch context

В приведенном примере создается стек контекстов выполнения с использованием нескольких участников.The following example creates a context execution stack using multiple principals. Затем инструкция REVERT используется для сброса контекста выполнения к предыдущему участнику.The REVERT statement is then used to reset the execution context to the previous caller. Инструкция REVERT выполняется множество раз, передвигаясь вверх по стеку до тех пор, пока контекст выполнения не будет установлен на первоначального участника.The REVERT statement is executed multiple times moving up the stack until the execution context is set to the original caller.

USE AdventureWorks2012;  
GO  
--Create two temporary principals  
CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb';  
CREATE LOGIN login2 WITH PASSWORD = 'Uor80$23b';  
GO  
CREATE USER user1 FOR LOGIN login1;  
CREATE USER user2 FOR LOGIN login2;  
GO  
--Give IMPERSONATE permissions on user2 to user1  
--so that user1 can successfully set the execution context to user2.  
GRANT IMPERSONATE ON USER:: user2 TO user1;  
GO  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
-- Set the execution context to login1.   
EXECUTE AS LOGIN = 'login1';  
--Verify the execution context is now login1.  
SELECT SUSER_NAME(), USER_NAME();  
--Login1 sets the execution context to login2.  
EXECUTE AS USER = 'user2';  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
-- The execution context stack now has three principals: the originating caller, login1 and login2.  
--The following REVERT statements will reset the execution context to the previous context.  
REVERT;  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
REVERT;  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
  
--Remove temporary principals.  
DROP LOGIN login1;  
DROP LOGIN login2;  
DROP USER user1;  
DROP USER user2;  
GO  

В следующем примере устанавливается контекст выполнения сеанса для определенного пользователя и указывается предложение WITH NO REVERT COOKIE = @varbinary_variable.The following example sets the execution context of a session to a specified user and specifies the WITH NO REVERT COOKIE = @varbinary_variable clause. Инструкция REVERT обязана указать значение, передаваемое переменной @cookie в EXECUTE AS инструкции, для успешного возвращения контекста обратно вызывающему.The REVERT statement must specify the value passed to the @cookie variable in the EXECUTE AS statement to successfully revert the context back to the caller. Чтобы запустить этот образец, должно существовать имя входа login1 и пользователь user1, созданные в примере А.To run this example, the login1 login and user1 user created in example A must exist.

DECLARE @cookie varbinary(8000);  
EXECUTE AS USER = 'user1' WITH COOKIE INTO @cookie;  
-- Store the cookie in a safe location in your application.  
-- Verify the context switch.  
SELECT SUSER_NAME(), USER_NAME();  
--Display the cookie value.  
SELECT @cookie;  
GO  
-- Use the cookie in the REVERT statement.  
DECLARE @cookie varbinary(8000);  
-- Set the cookie value to the one from the SELECT @cookie statement.  
SET @cookie = <value from the SELECT @cookie statement>;  
REVERT WITH COOKIE = @cookie;  
-- Verify the context switch reverted.  
SELECT SUSER_NAME(), USER_NAME();  
GO  

См. также:See Also

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