Partilhar via


EXECUTAR COMO (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure do Azure Synapse Analytics

Define o contexto de execução de uma sessão.

Por padrão, uma sessão começa quando um usuário faz login e termina quando o usuário faz logoff. Todas as operações durante uma sessão estão sujeitas a verificações de permissão em relação a esse usuário. Quando uma instrução EXECUTE AS é executada, o contexto de execução da sessão é alternado para o login ou nome de usuário especificado. Após a mudança de contexto, as permissões são verificadas em relação aos tokens de segurança de login e usuário dessa conta, em vez da pessoa que chama a instrução EXECUTE AS. Em essência, o usuário ou a conta de login é representada durante a execução da sessão ou do módulo, ou a opção de contexto é explicitamente revertida.

Transact-SQL convenções de sintaxe

Sintaxe

{ EXEC | EXECUTE } AS <context_specification>  
[;]  
  
<context_specification>::=  
{ LOGIN | USER } = 'name'  
    [ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]   
| CALLER  

Argumentos

INICIAR SESSÃO
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.

Especifica que o contexto de execução a ser representado é um login. O escopo da representação está no nível do servidor.

Observação

Essa opção não está disponível em um banco de dados contido, no Banco de Dados SQL do Azure ou no Azure Synapse Analytics.

UTILIZADOR
Especifica o contexto a ser representado como um usuário no banco de dados atual. O escopo da representação é restrito ao banco de dados atual. Uma mudança de contexto para um usuário de banco de dados não herda as permissões de nível de servidor desse usuário.

Importante

Enquanto a mudança de contexto para o usuário do banco de dados estiver ativa, qualquer tentativa de acessar recursos fora do banco de dados fará com que a instrução falhe. Isso inclui instruções de de banco de dados USE , consultas distribuídas e consultas que fazem referência a outro banco de dados que usa identificadores de três ou quatro partes.

'nome' É um nome de usuário ou login válido. nome deve ser membro do sysadmin função de servidor fixa ou existir como entidade de sys.database_principals ou sys.server_principals, respectivamente.

nome pode ser especificado como uma variável local.

nome deve ser uma conta singleton e não pode ser um grupo, função, certificado, chave ou conta interna, como NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService ou NT AUTHORITY\LocalSystem.

Para obter mais informações, consulte Especificando um nome de usuário ou de login mais adiante neste tópico.

SEM REVERSÃO
Especifica que a opção de contexto não pode ser revertida para o contexto anterior. A opção NO REVERT só pode ser usada no nível adhoc.

Para obter mais informações sobre como reverter para o contexto anterior, consulte REVERT (Transact-SQL).

COOKIE EM @varbinary_variable
Especifica que o contexto de execução só pode ser revertido para o contexto anterior se a instrução de chamada REVERT WITH COOKIE contiver o valor @varbinary_variable correto. O Mecanismo de Banco de Dados passa o cookie para @varbinary_variable. A opção COOKIE INTO só pode ser utilizada a nível adhoc.

@varbinary_variable é varbinary(8000).

Observação

O cookie parâmetro OUTPUT for está atualmente documentado como varbinary(8000) que é o comprimento máximo correto. No entanto, a implementação atual retorna varbinary(100). Os aplicativos devem reservar varbinary(8000) para que o aplicativo continue a operar corretamente se o tamanho de retorno do cookie aumentar em uma versão futura.

CHAMADOR
Quando usado dentro de um módulo, especifica as instruções dentro do módulo são executadas no contexto do chamador do módulo. Quando usada fora de um módulo, a instrução não tem ação.

Observação

Esta opção não está disponível no Azure Synapse Analytics.

Comentários

A alteração no contexto de execução permanece em vigor até que ocorra uma das seguintes situações:

  • Outra instrução EXECUTE AS é executada.

  • Uma instrução REVERT é executada.

  • A sessão é descartada.

  • O procedimento armazenado ou gatilho onde o comando foi executado é encerrado.

Você pode criar uma pilha de contexto de execução chamando a instrução EXECUTE AS várias vezes em várias entidades. Quando chamada, a instrução REVERT alterna o contexto para o login ou usuário no próximo nível acima na pilha de contexto. Para obter uma demonstração desse comportamento, consulte Exemplo A.

Especificando um usuário ou nome de login

O nome de usuário ou login especificado em EXECUTE AS <context_specification> deve existir como uma entidade de segurança em sys.database_principals ou sys.server_principals, respectivamente, ou a instrução EXECUTE AS falhará. Além disso, as permissões IMPERSONATE devem ser concedidas na entidade de segurança. A menos que o chamador seja o proprietário do banco de dados ou seja membro do sysadmin função de servidor fixa, a entidade de segurança deve existir mesmo quando o usuário estiver acessando o banco de dados ou instância do SQL Server por meio de uma associação de grupo do Windows. Por exemplo, suponha as seguintes condições:

  • grupo CompanyDomain\SQLUsers tem acesso ao banco de dados Sales.

  • CompanyDomain\SqlUser1 é membro do SQLUsers e, portanto, tem acesso implícito ao banco de dados Sales.

Embora CompanyDomain\SqlUser1 tenha acesso ao banco de dados por meio da associação ao grupo SQLUsers , a instrução falha porque não existe como entidade de segurança no banco de dados.

Se o usuário estiver órfão (o login associado não existe mais) e o usuário não tiver sido criado com SEM LOGIN, EXECUTAR COMO falhará para o usuário.

Melhores Práticas

Especifique um login ou usuário que tenha o mínimo de privilégios necessários para executar as operações na sessão. Por exemplo, não especifique um nome de login com permissões no nível do servidor, se apenas permissões no nível do banco de dados forem necessárias; ou não especifique uma conta de proprietário de banco de dados, a menos que essas permissões sejam necessárias.

Atenção

A instrução EXECUTE AS pode ter êxito, desde que o Mecanismo de Banco de Dados possa resolver o nome. Se existir um usuário de domínio, o Windows poderá resolver o usuário para o Mecanismo de Banco de Dados, mesmo que o usuário do Windows não tenha acesso ao SQL Server. Isso pode levar a uma condição em que um logon sem acesso ao SQL Server parece estar conectado, embora o logon representado tenha apenas as permissões concedidas ao público ou convidado.

Usando WITH NO REVERT

Quando a instrução EXECUTE AS inclui a cláusula opcional WITH NO REVERT, o contexto de execução de uma sessão não pode ser redefinido usando REVERT ou executando outra instrução EXECUTE AS. O contexto definido pela instrução permanece em vigor até que a sessão seja descartada.

Quando a cláusula WITH NO REVERT COOKIE = @varbinary_variable é especificada, o Mecanismo de Banco de Dados do SQL Server passa o valor do cookie para @varbinary_variable. O contexto de execução definido por essa instrução só pode ser revertido para o contexto anterior se a chamada REVERT WITH COOKIE = @varbinary_variable instrução contiver o mesmo valor @varbinary_variable.

Essa opção é útil em um ambiente no qual o pool de conexões é usado. O pool de conexões é a manutenção de um grupo de conexões de banco de dados para reutilização por aplicativos em um servidor de aplicativos. Como o valor passado para @varbinary_variable é conhecido apenas pelo chamador da instrução EXECUTE AS, o chamador pode garantir que o contexto de execução que eles estabelecem não pode ser alterado por mais ninguém.

Determinando o login original

Use a função ORIGINAL_LOGIN para retornar o nome do logon que se conectou à instância do SQL Server. Você pode usar essa função para retornar a identidade do login original em sessões nas quais há muitas opções de contexto explícitas ou implícitas.

Permissões

Para especificar EXECUTAR COMO em um login, o chamador deve ter permissão REPRESENTAR no nome de login especificado e não deve ser negada a PERSONIFICAR QUALQUER LOGIN permissão. Para especificar EXECUTE AS em um usuário de banco de dados, o chamador deve ter permissões IMPERSONATE no nome de usuário especificado. Quando EXECUTAR COMO CHAMADOR é especificado, permissões REPRESENTAR não são necessárias.

Exemplos

Um. Usando EXECUTE AS e REVERT para alternar o contexto

O exemplo a seguir cria uma pilha de execução de contexto usando vários principais. A instrução REVERT é usada para redefinir o contexto de execução para o chamador anterior. A instrução REVERT é executada várias vezes movendo-se para cima na pilha até que o contexto de execução seja definido como 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 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 current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
REVERT;  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
  
--Remove temporary principals.  
DROP LOGIN login1;  
DROP LOGIN login2;  
DROP USER user1;  
DROP USER user2;  
GO  

O exemplo a seguir define o contexto de execução de uma sessão para um usuário especificado e especifica a cláusula WITH COOKIE INTO @varbinary_variable. A instrução REVERT deve especificar o valor passado para a variável @cookie na instrução EXECUTE AS para reverter com êxito o contexto de volta para o chamador. Para executar este exemplo, o login de login1 e user1 usuário criado no exemplo A deve existir.

DECLARE @cookie VARBINARY(8000);  
EXECUTE AS USER = 'user1' WITH COOKIE INTO @cookie;  
-- Store the cookie in a safe location 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(8000);  
-- 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

REVERTER (Transact-SQL)
Cláusula EXECUTE AS (Transact-SQL)