Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure 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.
Usar REVERT WITH COOKIE
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
B. Usando a cláusula WITH COOKIE
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)