REVERT (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse Analytics

Riporta il contesto dell'esecuzione al chiamante dell'ultima EXECUTE AS istruzione.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Argomenti

CON COOKIE = @varbinary_variable
Specifica il cookie creato in una corrispondente EXECUTE AS istruzione stand-alone. @varbinary_variable è varbinary(100).

Osservazioni:

REVERT può essere specificato all'interno di un modulo come una stored procedure o una funzione definita dall'utente, oppure come un'istruzione autonoma. Quando specificato all'interno di un modulo, REVERT è applicabile solo alle EXECUTE AS affermazioni definite nel modulo. Ad esempio, la stored procedure seguente esegue un'istruzione EXECUTE AS seguita da un'istruzione 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  

Si supponga che nella sessione in cui viene eseguita la stored procedure il contesto di esecuzione della sessione venga modificato in modo esplicito in login1, come illustrato nell'esempio seguente.

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

L'istruzione REVERT definita all'interno di usp_myproc cambia il contesto di esecuzione impostato all'interno del modulo, ma non quello impostato al suo esterno. In sintesi, il contesto di esecuzione della sessione rimane impostato su login1.

Quando specificata come un'istruzione autonoma, REVERT si applica alle EXECUTE AS istruzioni definite all'interno di un batch o di una sessione. REVERT non ha effetto se l'enunciato corrispondente EXECUTE AS contiene la clausola WITH NO REVERT . In questo caso, il contesto di esecuzione rimane valido fino all'eliminazione della sessione.

L'istruzione EXECUTE AS utilizzata per impostare il contesto di esecuzione di una sessione può includere la clausola opzionale WITH NO REVERT COOKIE = @varbinary_variable. Quando questa istruzione viene eseguita, il motore di database passa il cookie a @varbinary_variable. Il contesto di esecuzione impostato da quell'istruzione può essere riportato al contesto precedente solo se l'istruzione chiamata REVERT WITH COOKIE = @varbinary_variable contiene il valore @varbinary_variable corretto.

Questo meccanismo risulta utile in un ambiente in cui vengono utilizzati pool di connessioni. Tramite i pool di connessioni vengono gestiti i gruppi di connessioni al database in modo che tali connessioni possano essere riutilizzate dalle applicazioni tra più utenti finali. Poiché il valore passato a @varbinary_variable è noto solo al chiamante dell'istruzione EXECUTE AS (in questo caso, all'applicazione), il chiamante può garantire che il contesto di esecuzione che stabilisce non possa essere modificato dall'utente finale che invoca l'applicazione. Dopo il ripristino del contesto di esecuzione l'applicazione può cambiare il contesto a un'altra entità.

Autorizzazioni

Non sono necessarie autorizzazioni.

Esempi

R. Uso EXECUTE AS di e REVERT per cambiare contesto

Nell'esempio seguente viene creato uno stack di contesti di esecuzione utilizzando più entità. Viene quindi utilizzata l'istruzione REVERT per ripristinare il contesto di esecuzione al chiamante precedente. L'istruzione REVERT viene eseguita più volte per innalzare di livello lo stack finché il contesto di esecuzione viene impostato sul chiamante originale.

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  

Il seguente esempio imposta il contesto di esecuzione di una sessione a un utente specificato e specifica la clausola WITH NO REVERT COOKIE = @varbinary_variable . Nell'istruzione REVERT è necessario specificare il valore passato alla variabile @cookie nell'istruzione EXECUTE AS per ripristinare correttamente il contesto al chiamante originale. Per eseguire questo esempio, l'account di accesso login1 e l'utente user1 creato nell'esempio A devono esistere.

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  

Vedi anche

EXECUTE AS (Transact-SQL)
EXECUTE AS Clausola (Transact-SQL)
ESEGUI (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)