Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Schakelt de uitvoeringscontext terug naar de aanroeper van de laatste EXECUTE AS-instructie.
Transact-SQL syntaxis-conventies
Syntaxis
REVERT
[ WITH COOKIE = @varbinary_variable ]
Arguments
MET COOKIE = @varbinary_variable
Specificeert de cookie die is aangemaakt in een overeenkomstige EXECUTE AS-standalone statement.
@varbinary_variable is varbinair(100).
Opmerkingen
REVERT kan worden gespecificeerd binnen een module zoals een opgeslagen procedure of door de gebruiker gedefinieerde functie, of als een zelfstandige instructie. Wanneer gespecificeerd binnen een module, is REVERT alleen van toepassing op EXECUTE AS-instructies die in de module zijn gedefinieerd. Bijvoorbeeld, de volgende opgeslagen procedure geeft een EXECUTE AS verklaring gevolgd door een REVERT verklaring.
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
Stel dat in de sessie waarin de opgeslagen procedure wordt uitgevoerd, de uitvoeringscontext van de sessie expliciet wordt gewijzigd naar login1, zoals getoond in het volgende voorbeeld.
-- Sets the execution context of the session to 'login1'.
EXECUTE AS LOGIN = 'login1';
GO
EXECUTE dbo.usp_myproc;
De REVERT instructie die binnen usp_myproc is gedefinieerd, wisselt de uitvoeringscontextset binnen de module, maar beïnvloedt de uitvoeringscontextset buiten de module niet. Dat wil zeggen, de uitvoeringscontext voor de sessie blijft gezet op login1.
Wanneer gespecificeerd als een zelfstandige instructie, geldt REVERT voor EXECUTE AS-statements die binnen een batch of sessie zijn gedefinieerd. REVERT heeft geen effect als de bijbehorende EXECUTE AS-instructie de WITH NO REVERT-clausule bevat. In dit geval blijft de uitvoeringscontext van kracht totdat de sessie wordt beëindigd.
GEBRUIK VAN REVERSE MET COOKIE
De EXECUTE AS-instructie die wordt gebruikt om de uitvoeringscontext van een sessie in te stellen, kan de optionele clausule ZONDER REVERT COOKIE = @varbinary_variable bevatten. Wanneer deze instructie wordt uitgevoerd, geeft de Database Engine de cookie door aan @varbinary_variable. De uitvoeringscontext die door die instructie is ingesteld, kan alleen worden teruggezet naar de vorige context als de aanroepende REVERT WITH COOKIE = @varbinary_variable-instructie de juiste @varbinary_variable-waarde bevat.
Dit mechanisme is nuttig in een omgeving waarin verbindingspooling wordt gebruikt. Verbindingspooling is het onderhouden van een groep databaseverbindingen voor hergebruik door applicaties bij meerdere eindgebruikers. Omdat de waarde die aan @varbinary_variable wordt doorgegeven alleen bekend is bij de aanroeper van de EXECUTE AS-instructie (in dit geval de applicatie), kan de aanroeper garanderen dat de uitvoeringscontext die zij opstellen niet kan worden gewijzigd door de eindgebruiker die de applicatie aanroept. Nadat de uitvoeringscontext is teruggedraaid, kan de applicatie de context wisselen naar een andere principal.
Permissions
Er zijn geen machtigingen vereist.
Voorbeelden
Eén. EXECUTE AS en REVERT gebruiken om van context te wisselen
Het volgende voorbeeld creëert een contextuitvoeringsstack door gebruik te maken van meerdere principals. De REVERT-instructie wordt vervolgens gebruikt om de uitvoeringscontext terug te zetten naar de vorige caller. De REVERT-instructie wordt meerdere keren uitgevoerd en omhoog in de stack verplaatst totdat de uitvoeringscontext wordt ingesteld op de oorspronkelijke aanroeper.
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
B. Gebruik van de WITH COOKIE-clausule
Het volgende voorbeeld stelt de uitvoeringscontext van een sessie in op een gespecificeerde gebruiker en specificeert de WITH NO REVERT COOKIE = @varbinary_variable clausule. De REVERT instructie moet de waarde specificeren die aan de variabele @cookie in de EXECUTE AS instructie wordt doorgegeven om de context succesvol terug te keren naar de aanroeper. Om dit voorbeeld te kunnen uitvoeren, moeten de login1 login en user1 gebruiker die in voorbeeld A zijn aangemaakt, bestaan.
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
Zie ook
UITVOER ALS (Transact-SQL)
UITVOEREN (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
AANMELDING MAKEN (Transact-SQL)
GEBRUIKER AANMAKEN (Transact-SQL)