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


REVERT (Transact-SQL)

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

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

Синтаксис

REVERT
    [ WITH COOKIE = @varbinary_variable ]

Аргументы

  • WITH COOKIE = @varbinary_variable
    Задает файл cookie, который был создан в соответствующей изолированной инструкции 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 содержит предложение WITH NO REVERT. В этом случае контекст выполнения остается в силе до завершения сеанса.

Инструкция EXECUTE AS, используемая для установки контекста выполнения сеанса, может включать необязательное предложение WITH NO REVERT COOKIE = @varbinary_variable. При выполнении этой инструкции компонент Database Engine передает файл cookie в аргументе @varbinary_variable. Контекст выполнения, установленный этой инструкцией, может быть возвращен к предыдущему контексту только в том случае, если вызываемая инструкция REVERT WITH COOKIE = @varbinary_variable содержит правильное значение аргумента @varbinary_variable .

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

Разрешения

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

Примеры

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

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

USE AdventureWorks2008R2;
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. Инструкция 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