REVERT (Transact-SQL)

Dotyczy:sql ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Przełącza kontekst wykonania z powrotem na wywołującego ostatnie EXECUTE AS zdanie.

Transact-SQL konwencje składni

Składnia

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Arguments

Z COOKIE = @varbinary_variable
Określa ciasteczko utworzone w odpowiadającym EXECUTE AS samodzielnym oświadczeniu. @varbinary_variable jest warbinary(100).

Uwagi

REVERT Może być określony w module, takim jak procedura przechowywana lub funkcja zdefiniowana przez użytkownika, albo jako samodzielne zdanie. Gdy jest określona wewnątrz modułu, REVERT jest stosowalna tylko do EXECUTE AS instrukcji zdefiniowanych w tym module. Na przykład następująca procedura przechowywana generuje EXECUTE AS instrukcje, po których następuje instrukcja 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  

Załóżmy, że w sesji, w której wykonywana jest procedura przechowywana, kontekst wykonania sesji jest wyraźnie zmieniany na login1, jak pokazano w poniższym przykładzie.

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

Instrukcja REVERT zdefiniowana wewnątrz usp_myproc przełącza zestaw kontekstu wykonawczego wewnątrz modułu, ale nie wpływa na zestaw kontekstu wykonawczego poza modułem. To znaczy, że kontekst wykonania sesji pozostaje ustawiony na .login1

Gdy jest określana jako samodzielne oświadczenie, REVERT dotyczy EXECUTE AS instrukcji zdefiniowanych w partii lub sesji. REVERT nie ma efektu, jeśli odpowiadające EXECUTE AS mu zdanie zawiera klauzulę WITH NO REVERT . W takim przypadku kontekst wykonania pozostaje w mocy do momentu przerwania sesji.

Instrukcja EXECUTE AS używana do ustawienia kontekstu wykonania sesji może zawierać opcjonalną klauzulę WITH NO REVERT COOKIE = @varbinary_variable. Po wykonaniu tego zdania silnik bazy danych przekazuje ciasteczko do @varbinary_variable. Kontekst wykonania ustalony przez to zdanie może być przywrócony do poprzedniego tylko wtedy, gdy instrukcja wywoływania REVERT WITH COOKIE = @varbinary_variable zawiera poprawną wartość @varbinary_variable .

Ten mechanizm jest przydatny w środowisku, w którym stosuje się pulowanie połączeń. Pula połączeń to utrzymywanie grupy połączeń bazy danych do ponownego wykorzystania przez aplikacje na wielu użytkownikach końcowych. Ponieważ wartość przekazana do @varbinary_variable jest znana tylko wywoływającemu EXECUTE AS polecenia (w tym przypadku aplikacji), wywołujący może zagwarantować, że kontekst wykonywania, który ustanawia, nie może zostać zmieniony przez użytkownika końcowego, który wywołuje aplikację. Po przywróceniu kontekstu wykonawczego aplikacja może zmienić kontekst na inny principal.

Permissions

Nie są wymagane żadne uprawnienia.

Przykłady

A. Wykorzystanie EXECUTE AS i REVERT do zmiany kontekstu

Poniższy przykład tworzy stos wykonania kontekstu, używając wielu principalów. Instrukcja REVERT jest następnie używana do resetowania kontekstu wykonywania do poprzedniego obiektu wywołującego. Instrukcja REVERT jest wykonywana wiele razy w górę stosu, dopóki kontekst wykonywania nie zostanie ustawiony na oryginalny obiekt wywołujący.

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  

Poniższy przykład ustawia kontekst wykonania sesji na określonym użytkowniku i określa klauzulę WITH NO REVERT COOKIE = @varbinary_variable . Instrukcja REVERT musi określić wartość przekazaną zmiennej @cookie w instrukcji, EXECUTE AS aby skutecznie przywrócić kontekst do wywołującego. Aby przeprowadzić ten przykład, login1 muszą istnieć login i user1 użytkownik utworzony w przykładzie 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  

Zobacz też

EXECUTE AS (Transact-SQL)
EXECUTE AS Klauzula (Transact-SQL)
WYKONAJ (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)