REVERT (Transact-SQL)REVERT (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

Переключает контекст выполнения в контекст участника, вызывавшего последнюю инструкцию EXECUTE AS.Switches the execution context back to the caller of the last EXECUTE AS statement.

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

СинтаксисSyntax

  
REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

АргументыArguments

WITH COOKIE = @varbinary_variableWITH COOKIE = @varbinary_variable
Задает файл cookie, который был создан в соответствующей изолированной инструкции EXECUTE AS.Specifies the cookie that was created in a corresponding EXECUTE AS stand-alone statement. @varbinary_variable — это varbinary(100) .@varbinary_variable is varbinary(100).

RemarksRemarks

Инструкцию REVERT можно указывать внутри модуля, такого как хранимая процедура или определяемая пользователем функция, или в качестве изолированной инструкции.REVERT can be specified within a module such as a stored procedure or user-defined function, or as a stand-alone statement. При указании внутри модуля инструкция REVERT применима только к инструкциям EXECUTE AS, определенным в модуле.When specified inside a module, REVERT is applicable only to EXECUTE AS statements defined in the module. Например, следующая хранимая процедура выполняет инструкцию EXECUTE AS, за которой следует инструкция REVERT.For example, the following stored procedure issues an EXECUTE AS statement followed by a REVERT statement.

CREATE PROCEDURE dbo.usp_myproc   
  WITH EXECUTE AS CALLER  
AS   
    SELECT SUSER_NAME(), USER_NAME();  
    EXECUTE AS USER = 'guest';  
    SELECT SUSER_NAME(), USER_NAME();  
    REVERT;  
    SELECT SUSER_NAME(), USER_NAME();  
GO  

Предположим, что в сеансе, в котором работает хранимая процедура, контекст выполнения сеанса явно изменен на login1, как показано в следующем примере.Assume that in the session in which the stored procedure is run, the execution context of the session is explicitly changed to login1, as shown in the following example.

  -- Sets the execution context of the session to 'login1'.  
EXECUTE AS LOGIN = 'login1';  
GO  
EXECUTE dbo.usp_myproc;   

Инструкция REVERT, определенная в модуле usp_myproc, переключает контекст выполнения, установленный внутри модуля, но не влияет на контекст выполнения, установленный снаружи модуля.The REVERT statement that is defined inside usp_myproc switches the execution context set inside the module, but does not affect the execution context set outside the module. Контекст выполнения для сеанса остается установленным в login1.That is, the execution context for the session remains set to login1.

При указании в качестве отдельной инструкции REVERT применяется к инструкциям EXECUTE AS, определенным внутри пакета или сеанса.When specified as a standalone statement, REVERT applies to EXECUTE AS statements defined within a batch or session. Инструкция REVERT не будет иметь эффекта, если соответствующая инструкция EXECUTE AS содержит предложение WITH NO REVERT.REVERT has no effect if the corresponding EXECUTE AS statement contains the WITH NO REVERT clause. В этом случае контекст выполнения остается в силе до завершения сеанса.In this case, the execution context remains in effect until the session is dropped.

Инструкция EXECUTE AS, которая используется для задания контекста выполнения для сеанса, может включать необязательное предложение WITH NO REVERT COOKIE = @varbinary_variable.The EXECUTE AS statement that is used to set the execution context of a session can include the optional clause WITH NO REVERT COOKIE = @varbinary_variable. При запуске этой инструкции компонент Компонент Database EngineDatabase Engine передает файлы cookie в переменную @varbinary_variable.When this statement is run, the Компонент Database EngineDatabase Engine passes the cookie 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 correct @varbinary_variable value.

Этот механизм полезен в окружениях, где используется пул соединений.This mechanism 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 across multiple end users. Так как значение, переданное @varbinary_variable, известно только субъекту, вызывающему инструкцию EXECUTE AS (в данном случае приложению), вызывающий субъект может гарантировать, что контекст выполнения, установленный им, не будет изменен конечным пользователем, который использует приложение.Because the value passed to @varbinary_variable is known only to the caller of the EXECUTE AS statement (in this case, the application), the caller can guarantee that the execution context they establish cannot be changed by the end user that invokes the application. После того как контекст выполнения возвращен, приложение может переключить контекст на другого участника.After the execution context is reverted, the application can switch context to another principal.

РазрешенияPermissions

Разрешения не требуются.No permissions are required.

ПримерыExamples

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

В следующем примере создается стек контекста выполнения при помощи нескольких участников.The following example creates a context execution stack by 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 that 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 the current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
REVERT;  
-- Display the current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
  
-- Remove the 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(100);  
EXECUTE AS USER = 'user1' WITH COOKIE INTO @cookie;  
-- Store the cookie somewhere safe 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(100);  
-- 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

EXECUTE AS (Transact-SQL) EXECUTE AS (Transact-SQL)
Предложение EXECUTE AS (Transact-SQL) EXECUTE AS Clause (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
SUSER_NAME (Transact-SQL) SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL) USER_NAME (Transact-SQL)
CREATE LOGIN (Transact-SQL) CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)CREATE USER (Transact-SQL)