Megosztás a következőn keresztül:


REVERT (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Visszakapcsolja a végrehajtási kontextust az utolsó EXECUTE AS utasítás hívójához.

Transact-SQL szintaxis konvenciók

Szemantika

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Arguments

SÜTIKTEL = @varbinary_variable
Megadja azt a sütit, amelyet egy megfelelő EXECUTE AS önálló utasításban hoztak létre. @varbinary_variablevarbináris(100).

Megjegyzések

A REVERT modulban is meghatározható, például tárolt eljárásban vagy felhasználó által definiált függvényben, vagy önálló utasításként. Ha egy modulban belül van megadva, a REVERT csak a modulban definiált EXECUTE AS utasításokra alkalmazható. Például a következő tárolt eljárás egy EXECUTE AS utasítást, amit egy REVERT utasítás követ.

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  

Tegyük fel, hogy abban az ülésben, amelyben a tárolt eljárás fut, a munkafolyamat végrehajtási kontextusa kifejezetten változik , login1ahogy azt a következő példa is mutatja.

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

A REVERT belső usp_myproc utasítás a modulon belüli végrehajtási kontextushalmazt váltja, de nem befolyásolja a modulon kívüli végrehajtási kontextushalmazt. Vagyis a játékmenet végrehajtási kontextusa továbbra is .login1

Ha önálló utasításként van megadva, a REVERT a EXECUTE AS utasításokra vonatkozik, amelyeket egy kötetben vagy ülésen belül definiálnak. A REVERT nem hat, ha a megfelelő EXECUTE AS utasítás tartalmazza a WITH NO REVERT záradékot. Ebben az esetben a végrehajtási kontextus életben marad, amíg az ülés el nem kerül.

Az EXECUTE AS utasítás, amely a session végrehajtási kontextusának beállításához szolgál, tartalmazhatja az opcionális CLAUSE WITH NO REVERT COOKIE = @varbinary_variable. Amikor ezt az utasítást futtatják, az Database Engine átadja a sütit @varbinary_variable-nek. Az adott utasítás által állított végrehajtási kontextus csak akkor térhet vissza az előző kontextusba, ha a hívó REVERT WITH COOKIE = @varbinary_variable utasítás tartalmazza a helyes @varbinary_variable értéket.

Ez a mechanizmus hasznos olyan környezetben, ahol a kapcsolati poolinget alkalmazzák. A kapcsolati pooling egy adatbázis-kapcsolatcsoport karbantartása, amelyet alkalmazások újrahasznosítanak több végfelhasználó számára. Mivel az @varbinary_variable-nek továbbított értéket csak az EXECUTE AS utasítás hívója ismeri (jelen esetben az alkalmazás), a hívó garantálhatja, hogy az általa létrehozott végrehajtási kontextust az alkalmazást hívó végfelhasználó nem változtathatja meg. Miután a végrehajtási kontextust visszafordították, az alkalmazás átválthat egy másik alapvetélre.

Permissions

Nincs szükség engedélyre.

Példák

A. EXECUTE AS és REVERT használata a kontextus váltásához

Az alábbi példa több alapelv használatával hoz létre egy kontextus végrehajtási stacket. A REVERT utasítást ezután a végrehajtási kontextus visszaállítására használják az előző hívóra. A REVERT utasítást többször is lefuttatják, miközben felfelé haladnak a veremben, amíg a végrehajtási kontextus az eredeti hívóra nem állítódik.

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  

A következő példa egy adott felhasználónak állítja be a munkamenet végrehajtási kontextusát, és megadja a WITH NO REVERT COOKIE = @varbinary_variable záradékot. Az REVERT állításnak meg kell határoznia az adott változónak átadott értéket @cookieEXECUTE AS , hogy sikeresen visszaállítsa a kontextust a hívóhoz. A példához login1 a bejelentkezésnek és user1 az A példában létrehozott felhasználónak meg kell léteznie.

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  

Lásd még:

VÉGREHAJTÁS (Transact-SQL)
EXECUTE AS klauzula (Transact-SQL)
EXECUTE (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
HITELÉVÉ NYITÁS (Transact-SQL)
CREATE USER (Transact-SQL)