REVERT (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Byter exekveringskontexten tillbaka till anroparen av det senaste EXECUTE AS-uttalandet.

Transact-SQL syntaxkonventioner

Syntax

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Arguments

MED COOKIE = @varbinary_variable
Specificerar cookien som skapades i en motsvarande EXECUTE AS-fristående sats. @varbinary_variable är varbinär (100).

Anmärkningar

REVERT kan specificeras inom en modul, såsom en lagrad procedur eller användardefinierad funktion, eller som en fristående sats. När det specificeras inom en modul är REVERT endast tillämpligt på EXECUTE AS-satser som definieras i modulen. Till exempel utfärdar följande lagrad procedur ett EXECUTE AS uttalande följt av ett REVERT uttalande.

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  

Antag att i den session där den lagrade proceduren körs, ändras exekveringskontexten för sessionen uttryckligen till login1, som visas i följande exempel.

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

Satsen REVERT som definieras inuti usp_myproc byter exekveringskontextuppsättningen inne i modulen, men påverkar inte exekveringskontextuppsättningen utanför modulen. Det vill säga, exekveringskontexten för sessionen förblir satt till login1.

När det specificeras som ett fristående uttalande gäller REVERT för EXECUTE AS-satser som definieras inom en batch eller session. REVERT har ingen effekt om motsvarande EXECUTE AS-sats innehåller WITH NO REVERT-klausulen. I detta fall förblir exekveringskontexten i kraft tills sessionen avslutas.

EXECUTE AS-satsen som används för att sätta exekveringskontexten för en session kan inkludera den valfria klausulen UTAN ÅTERSTÄLLNINGSCOOKIE = @varbinary_variable. När detta uttalande körs skickar databasmotorn cookien till @varbinary_variable. Exekveringskontexten som satts av den satsen kan endast återställas till föregående kontext om den anropande satsen REVERT WITH COOKIE = @varbinary_variable innehåller rätt @varbinary_variable-värde .

Denna mekanism är användbar i en miljö där connection pooling används. Anslutningspooling är underhållet av en grupp databasanslutningar för återanvändning av applikationer över flera slutanvändare. Eftersom värdet som skickas till @varbinary_variable endast är känt av anroparen av EXECUTE AS-satsen (i detta fall applikationen), kan anroparen garantera att exekveringskontexten de etablerar inte kan ändras av slutanvändaren som anropar applikationen. Efter att exekveringskontexten återställts kan applikationen byta kontext till en annan principal.

Permissions

Inga behörigheter krävs.

Examples

A. Att använda EXECUTE AS och REVERT för att byta kontext

Följande exempel skapar en kontextexekveringsstack genom att använda flera principer. REVERT-satsen används sedan för att återställa exekveringskontexten till föregående anropare. REVERT-satsen körs flera gånger och flyttas uppåt i stacken tills exekveringskontexten sätts till den ursprungliga anroparen.

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  

Följande exempel sätter exekveringskontexten för en session till en specificerad användare och specificerar klausulen WITH NO REVERT COOKIE = @varbinary_variable . Satsen REVERT måste specificera värdet som skickas till variabeln @cookie i satsen EXECUTE AS för att framgångsrikt återställa kontexten till anroparen. För att köra detta exempel måste inloggningen och user1 användaren login1 som skapats i exempel A finnas.

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  

Se även

KÖR SOM (Transact-SQL)
EXECUTE AS-klausulen (Transact-SQL)
UTFÖR (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
SKAPA INLOGGNING (Transact-SQL)
SKAPA ANVÄNDARE (Transact-SQL)