REVERT (Transact-SQL)
Переключает контекст выполнения в контекст участника, вызывавшего последнюю инструкцию EXECUTE AS.
Синтаксис
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. В этом случае контекст выполнения остается в силе до завершения сеанса.
Использование инструкции REVERT WITH COOKIE
Инструкция 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 AdventureWorks;
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 COOKIE
В следующем примере контекст выполнения сеанса устанавливается на определенного пользователя и указывается предложение WITH NO REVERT COOKIE = @varbinary\_variable. В инструкции REVERT необходимо указать значение, передаваемое переменной @cookie в инструкции EXECUTE AS, для успешного возвращения контекста участнику. Чтобы можно было запустить этот пример, должно существовать имя входа login1 и пользователь user1, созданные в примере A.
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