REVERT (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics

Restaure le contexte d'exécution de l'appelant de la dernière instruction EXECUTE AS.

Conventions de la syntaxe Transact-SQL

Syntaxe

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

WITH COOKIE = @varbinary_variable
Spécifie le cookie créé dans une instruction EXECUTE AS autonome correspondante. @varbinary_variable est varbinary(100).

Remarques

REVERT peut figurer dans un module tel qu'une procédure stockée ou une fonction définie par l'utilisateur, mais aussi en tant qu'instruction autonome. À l'intérieur d'un module, REVERT s'applique uniquement aux instructions EXECUTE AS définies dans le module. Par exemple, la procédure stockée suivante exécute une instruction EXECUTE AS suivie d'une instruction 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  

Supposons que dans la session où la procédure stockée est exécutée, le contexte d'exécution de la session est explicitement modifié en login1, comme dans l'exemple ci-dessous.

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

L’instruction REVERT définie dans usp_myproc change le contexte d’exécution défini dans le module, mais elle n’affecte pas le contexte d’exécution défini à l’extérieur du module. Autrement dit, le contexte d'exécution de la session reste login1.

Lorsque REVERT est une instruction autonome, elle s'applique aux instructions EXECUTE AS définies dans un traitement ou une session. REVERT n'a aucun effet si l'instruction EXECUTE AS correspondante contient la clause WITH NO REVERT. Dans ce cas, le contexte d'exécution reste en vigueur jusqu'à la suppression de la session.

L’instruction EXECUTE AS utilisée pour définir le contexte d’exécution d’une session peut comprendre la clause facultative WITH NO REVERT COOKIE = @varbinary_variable. Quand cette instruction est exécutée, le Moteur de base de données passe le cookie à @varbinary_variable. Le contexte d’exécution défini par cette instruction ne peut être restauré vers le contexte précédent que si l’instruction REVERT WITH COOKIE = @varbinary_variable appelante contient la valeur @varbinary_variable correcte.

Ce mécanisme est utile dans un environnement utilisant le groupement de connexions. Le groupement de connexions est la maintenance d'un groupe de connexions de base de données en vue de leur réutilisation par plusieurs utilisateurs finaux. Comme la valeur passée à @varbinary_variable n’est connue que de l’appelant de l’instruction EXECUTE AS (en l’occurrence, l’application), celui-ci peut garantir que le contexte d’exécution qu’il établit ne sera pas modifié par l’utilisateur final qui appelle l’application. Après restauration du contexte d'exécution, l'application peut changer de contexte au profit d'un autre principal.

Autorisations

Aucune autorisation n'est requise.

Exemples

R. Utilisation de EXECUTE AS et REVERT pour changer de contexte

L'exemple ci-dessous crée une pile de contextes d'exécution à l'aide de plusieurs principaux. L'instruction REVERT y est ensuite utilisée pour rendre le contexte d'exécution à l'appelant précédent. L'instruction REVERT est exécutée plusieurs fois en remontant dans la pile, jusqu'à ce que le contexte d'exécution revienne à l'appelant d'origine.

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  

L’exemple suivant définit le contexte d’exécution d’une session sur un utilisateur spécifié et précise la clause WITH NO REVERT COOKIE = @varbinary_variable. L'instruction REVERT doit spécifier la valeur passée à la variable @cookie dans l'instruction EXECUTE AS pour ramener le contexte à l'appelant. Pour exécuter cet exemple, la connexion login1 et l'utilisateur user1 créés dans l'exemple A doivent exister.

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  

Voir aussi

EXECUTE AS (Transact-SQL)
Clause EXECUTE AS (Transact-SQL)
EXECUTE (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
CREATE LOGIN (Transact-SQL)
CRÉER UN UTILISATEUR (Transact-SQL)