REVERT (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics

Wechselt den Ausführungskontext zurück zum Aufrufer der letzten EXECUTE AS-Anweisung.

Transact-SQL-Syntaxkonventionen

Syntax

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Argumente

WITH COOKIE = @varbinary_variable
Gibt das Cookie an, das in einer entsprechenden eigenständigen EXECUTE AS-Anweisung erstellt wurde. @varbinary_variable entspricht varbinary(100).

Bemerkungen

REVERT kann in einem Modul, wie einer gespeicherten Prozedur oder benutzerdefinierten Funktion, oder in einer eigenständigen Anweisung angegeben werden. Innerhalb eines Moduls kann REVERT nur auf EXECUTE AS-Anweisungen angewendet werden, die im Modul definiert sind. So gibt beispielsweise die folgende gespeicherte Prozedur eine EXECUTE AS-Anweisung aus, gefolgt von einer REVERT-Anweisung.

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  

Angenommen, in der Sitzung, in der die gespeicherte Prozedur ausgeführt wird, wird der Ausführungskontext der Sitzung explizit in login1 geändert, wie im folgenden Beispiel veranschaulicht.

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

Die in usp_myproc definierte REVERT-Anweisung wechselt den im Modul festgelegten Ausführungskontext, wirkt sich jedoch nicht auf den außerhalb des Moduls festgelegten Ausführungskontext aus. Der Ausführungskontext für die Sitzung bleibt also auf login1 festgelegt.

Als eigenständige Anweisung wird REVERT auf EXECUTE AS-Anweisungen angewendet, die in einem Batch oder einer Sitzung definiert sind. REVERT hat keinerlei Auswirkungen, wenn die entsprechende EXECUTE AS-Anweisung die WITH NO REVERT-Klausel enthält. In diesem Fall bleibt der Ausführungskontext so lange wirksam, bis die Sitzung gelöscht wird.

Die zum Festlegen des Ausführungskontexts einer Sitzung verwendete EXECUTE AS-Anweisung kann die optionale Klausel WITH NO REVERT COOKIE = @varbinary_variable enthalten. Wird diese Anweisung ausgeführt, übergibt Datenbank-Engine das Cookie an @varbinary_variable. Der von dieser Anweisung festgelegte Ausführungskontext kann nur dann auf einen vorherigen Kontext zurückgesetzt werden, wenn die aufrufende Anweisung REVERT WITH COOKIE = @varbinary_variable-Anweisung den korrekten @varbinary_variable-Wert enthält.

Dieser Mechanismus eignet sich für eine Umgebung, in der Verbindungs-Pooling verwendet wird. Verbindungs-Pooling bezeichnet die Verwaltung einer Gruppe von Datenbankverbindungen für die Wiederverwendung durch Anwendungen durch mehrere Endbenutzer. Da der an @varbinary_variable übergebene Wert nur dem Aufrufer der EXECUTE AS-Anweisung bekannt ist (in diesem Fall der Anwendung), kann der Aufrufer sicherstellen, dass der eingerichtete Ausführungskontext nicht von dem Endbenutzer geändert werden kann, der die Anwendung aufruft. Nach dem Wiederherstellen des Ausführungskontexts kann die Anwendung einen Kontextwechsel zu einem anderen Prinzipal durchführen.

Berechtigungen

Es sind keine Berechtigungen erforderlich.

Beispiele

A. Verwenden von EXECUTE AS und REVERT zum Wechseln des Kontexts

Im folgenden Beispiel wird ein Kontextausführungsstapel mithilfe mehrere Prinzipale erstellt. Dann wird der Ausführungskontext mithilfe der REVERT-Anweisung zum vorherigen Aufrufer gewechselt. Die REVERT-Anweisung wird mehrfach ausgeführt und im Stapel nach oben verschoben, bis der Ausführungskontext beim ursprünglichen Aufrufer angelangt ist.

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  

Im folgenden Beispiel wird der Ausführungskontext einer Sitzung auf einen angegebenen Benutzer festgelegt und die WITH NO REVERT COOKIE = @varbinary_variable-Klausel angegeben. In der REVERT-Anweisung muss der an die @cookie-Variable in der EXECUTE AS-Anweisung übergebene Wert angegeben sein, damit der Kontext erfolgreich auf den Aufrufer zurückgesetzt werden kann. Zur Ausführung dieses Beispiels müssen der login1-Anmeldename und der user1-Benutzer, die in Beispiel A erstellt wurden, vorhanden sein.

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  

Weitere Informationen

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