Sdílet prostřednictvím


ZPĚT (Transact-SQL)

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instanceazure Synapse Analytics

Přepíná kontext vykonání zpět na volajícího posledního příkazu EXECUTE AS.

Transact-SQL konvence syntaxe

Syntaxe

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Arguments

S COOKIE = @varbinary_variable
Specifikuje cookie, které bylo vytvořeno v odpovídajícím samostatném příkazu EXECUTE AS . @varbinary_variable je varbinární(100).

Poznámky

REVERT může být specifikován v modulu, například jako uložená procedura nebo uživatelem definovaná funkce, nebo jako samostatný příkaz. Pokud je REVERT zadán uvnitř modulu, lze použít pouze pro příkazy EXECUTE AS definované v modulu. Například následující uložená procedura vydá EXECUTE AS příkaz následovaný příkazem 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  

Předpokládejme, že v relaci, ve které je uložená procedura spuštěna, je kontext provádění relace explicitně změněn na login1, jak je ukázáno v následujícím příkladu.

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

Příkaz REVERT definovaný uvnitř usp_myproc mění sadu vykonávacího kontextu uvnitř modulu, ale neovlivňuje sadu vykonávacího kontextu mimo modul. To znamená, že kontext provádění relace zůstává nastaven na login1.

Pokud je specifikován jako samostatný příkaz, REVERT se vztahuje na příkazy EXECUTE AS definované v rámci dávky nebo relace. REVERT nemá žádný účinek, pokud odpovídající příkaz EXECUTE AS obsahuje klauzuli WITH NO REVERT (BEZ REVERT). V tomto případě zůstává kontext vykonání v platnosti, dokud není relace ukončena.

Příkaz EXECUTE AS, který se používá k nastavení kontextu vykonání relace, může obsahovat volitelnou klauzuli WITH NO REVERT COOKIE = @varbinary_variable. Když je tento příkaz vykonán, databázový engine předá cookie @varbinary_variable. Kontext vykonávání nastavený tímto příkazem lze vrátit do předchozího kontextu pouze tehdy, pokud příkaz volajícího REVERT WITH COOKIE = @varbinary_variable obsahuje správnou hodnotu @varbinary_variable .

Tento mechanismus je užitečný v prostředí, kde se používá pooling spojení. Poolování spojení je udržování skupiny databázových připojení pro opětovné použití aplikacemi napříč více koncovými uživateli. Protože hodnota předaná @varbinary_variable je známa pouze volajícímu příkazu EXECUTE AS (v tomto případě aplikaci), může volající zaručit, že kontext provádění, který nastaví, nemůže být změněn koncovým uživatelem, který aplikaci vyvolá. Po vrácení kontextu vykonání může aplikace přepnout kontext na jiný principal.

Povolení

Nejsou vyžadována žádná oprávnění.

Examples

A. Použití EXECUTE AS a REVERT pro přepnutí kontextu

Následující příklad vytváří kontextový skládací zásobník pomocí více principů. Příkaz REVERT se pak použije k resetování kontextu vykonání na předchozího volajícího. Příkaz REVERT se vykonává několikrát a postupuje výš ve stacku, dokud není kontext provedení nastaven na původního volajícího.

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  

Následující příklad nastavuje kontext vykonávání relace na určeného uživatele a specifikuje klauzuli WITH NO REVERT COOKIE = @varbinary_variable . Příkaz REVERT musí specifikovat hodnotu předanou @cookie proměnné ve příkazu EXECUTE AS , aby se kontext úspěšně vrátil zpět volajícímu. Pro provedení tohoto příkladu login1 musí existovat přihlášení a uživatel vytvořený user1 v příkladu 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  

Viz také

VYKONAT AS (Transact-SQL)
Klauzule EXECUTE AS (Transact-SQL)
EXECUTE (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
VYTVOŘIT PŘIHLÁŠENÍ (Transact-SQL)
VYTVOŘIT UŽIVATELE (Transact-SQL)