Partilhar via


REVERT (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse Analytics

Muda o contexto de execução de volta para o chamador da última instrução EXECUTE AS.

Transact-SQL convenções de sintaxe

Sintaxe

REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

Arguments

COM COOKIE = @varbinary_variable
Especifica o cookie criado numa instrução independente EXECUTE AS. @varbinary_variable é varbinary(100).

Observações

O REVERT pode ser especificado dentro de um módulo, como um procedimento armazenado ou função definida pelo utilizador, ou como uma instrução autónoma. Quando especificado dentro de um módulo, REVERT é aplicável apenas às instruções EXECUTE AS definidas no módulo. Por exemplo, o procedimento armazenado seguinte emite uma EXECUTE AS instrução seguida de uma REVERT instrução.

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  

Assuma que na sessão em que o procedimento armazenado é executado, o contexto de execução da sessão é explicitamente alterado para login1, como mostrado no exemplo seguinte.

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

A REVERT instrução definida no interior usp_myproc troca o conjunto de contexto de execução dentro do módulo, mas não afeta o conjunto de contexto de execução fora do módulo. Ou seja, o contexto de execução da sessão mantém-se definido como login1.

Quando especificado como uma instrução autónoma, REVERT aplica-se às instruções EXECUTE AS definidas dentro de um lote ou sessão. REVERT não tem efeito se a instrução EXECUTE AS correspondente contiver a cláusula WITH NO REVERT. Neste caso, o contexto de execução mantém-se em vigor até a sessão ser interrompida.

A instrução EXECUTE AS usada para definir o contexto de execução de uma sessão pode incluir a cláusula opcional WITH NO REVERT COOKIE = @varbinary_variable. Quando esta instrução é executada, o Motor de Base de Dados passa o cookie para @varbinary_variable. O contexto de execução definido por essa instrução só pode ser revertido para o contexto anterior se a instrução chamada REVERT WITH COOKIE = @varbinary_variable contiver o valor @varbinary_variable correto.

Este mecanismo é útil num ambiente onde se utiliza o agrupamento de conexões. O pooling de ligações é a manutenção de um grupo de ligações à base de dados para reutilização por aplicações entre múltiplos utilizadores finais. Como o valor passado para @varbinary_variable é conhecido apenas pelo chamador da instrução EXECUTE AS (neste caso, a aplicação), o chamador pode garantir que o contexto de execução que estabelece não pode ser alterado pelo utilizador final que invoca a aplicação. Depois de o contexto de execução ser revertido, a aplicação pode mudar de contexto para outro principal.

Permissions

Não são necessárias permissões.

Examples

A. Usar EXECUTE AS e REVERT para mudar de contexto

O exemplo seguinte cria uma pilha de execução de contexto usando múltiplos princípios. A instrução REVERT é então usada para redefinir o contexto de execução para o chamador anterior. A instrução REVERT é executada várias vezes subindo na pilha até que o contexto de execução seja definido para o chamador original.

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  

O exemplo seguinte define o contexto de execução de uma sessão para um utilizador especificado e especifica a cláusula WITHOUT REVERT COOKIE = @varbinary_variable . A REVERT instrução deve especificar o valor passado à @cookie variável na EXECUTE AS instrução para reverter com sucesso o contexto de volta ao chamador. Para executar este exemplo, o login1 login e user1 o utilizador criados no exemplo A devem existir.

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  

Ver também

EXECUTAR COMO (Transact-SQL)
Cláusula EXECUTE AS (Transact-SQL)
EXECUTAR (Transact-SQL)
SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL)
CRIAR LOGIN (Transact-SQL)
CRIAR USUÁRIO (Transact-SQL)