REVERT (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL AzureAzure Synapse Analytics

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Аргументы

С COOKIE = @varbinary_variable
Задаёт куки, созданный в соответствующем EXECUTE AS автономном операторе. @varbinary_variable имеет тип varbinary(100).

Замечания

REVERT может быть заказан внутри модуля, например, в хранимой процедуре или пользовательской функции, либо как отдельный оператор. Если указано внутри модуля, REVERT применимо только к EXECUTE AS операторам, определённым в модуле. Например, следующая хранимая процедура выполняет инструкцию EXECUTE AS, за которой следует инструкция REVERT.

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, как показано в следующем примере.

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

Инструкция REVERT, определенная в модуле usp_myproc, переключает контекст выполнения, установленный внутри модуля, но не влияет на контекст выполнения, установленный снаружи модуля. Контекст выполнения для сеанса остается установленным в login1.

Когда указано как отдельный оператор, REVERT применяется к EXECUTE AS операторам, определённым внутри пакета или сессии. REVERT не имеет силы, если соответствующее EXECUTE AS утверждение содержит клаузу БЕЗ REVERT ОТСУТСТВИЯ. В этом случае контекст выполнения остается в силе до завершения сеанса.

EXECUTE AS Оператор, используемый для установки контекста выполнения сессии, может включать опциональное предложение БЕЗ REVERT COOKIE = @varbinary_variable. При выполнении этой инструкции ядро СУБД передает файл cookie в @varbinary_variable. Контекст выполнения, установленный этим оператором, может быть вернут в предыдущий контекст только в том случае, если вызов REVERT оператора WITH COOKIE = @varbinary_variable содержит правильное значение @varbinary_variable .

Этот механизм полезен в окружениях, где используется пул соединений. Пул соединений — это поддержка группы подключений к базе данных для повторного использования приложениями нескольких конечных пользователей. Поскольку значение, переданное @varbinary_variable , известно только вызывающему EXECUTE AS оператору (в данном случае приложению), вызывающий может гарантировать, что установленный им контекст выполнения не может быть изменен конечным пользователем, вызывающим приложение. После того как контекст выполнения возвращен, приложение может переключить контекст на другого участника.

Разрешения

Разрешения не требуются.

Примеры

А. Использование EXECUTE AS и REVERT переключение контекста

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

USE AdventureWorks2022;  
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  

Следующий пример задаёт контекст выполнения сессии для определённого пользователя и задаёт клаузу БЕЗ REVERT COOKIE = @varbinary_variable . Инструкция REVERT обязана указать значение, передаваемое переменной @cookie в EXECUTE AS инструкции, для успешного возвращения контекста обратно вызывающему. Чтобы запустить этот образец, должно существовать имя входа login1 и пользователь user1, созданные в примере А.

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  

См. также

EXECUTE AS (Transact-SQL)
EXECUTE AS Пункт (Transact-SQL)
EXECUTE (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)