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
Azure SQL Managed Instance
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 EXECUTE AS instrução é executada, o contexto de execução da sessão é alterado para o login ou nome de utilizador especificado. Após a mudança de contexto, as permissões são verificadas contra os tokens de login e de segurança do utilizador dessa conta, em vez da pessoa que chama a EXECUTE AS declaração. 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.
Convenções sintáticas Transact-SQL
Sintaxe
{ EXEC | EXECUTE } AS <context_specification>
[;]
<context_specification>::=
{ LOGIN | USER } = 'name'
[ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]
| CALLER
Argumentos
LOGIN
Aplica-se a: SQL Server 2008 (10.0.x) e posteriores.
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
Esta opção não está disponível numa base de dados contida, Base de Dados SQL do Azure ou Azure Synapse Analytics.
USER
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
'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.
NÃO REVERT
Especifica que a opção de contexto não pode ser revertida para o contexto anterior. A opção NÃO REVERT só pode ser usada ao nível ad hoc.
Para mais informações sobre como reverter ao contexto anterior, veja REVERT (Transact-SQL).
COOKIE EM @varbinary_variable
Especifica que o contexto de execução só pode ser revertido ao contexto anterior se a instrução WITH COOKIE que chama REVERT contiver o valor correto de @varbinary_variable . O Database Engine passa a bolacha 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 EXECUTE AS afirmação é correr.
É feita uma REVERT declaração.
A sessão é descartada.
O procedimento armazenado ou gatilho onde o comando foi executado é encerrado.
Pode criar uma pilha de contexto de execução chamando a EXECUTE AS instrução várias vezes através de vários princípios. Quando chamada, a REVERT instrução muda o contexto para o login ou utilizador no nível seguinte 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 utilizador ou de login especificado em EXECUTE AS<context_specification> deve existir como principal em sys.database_principals ou sys.server_principals, respetivamente, caso contrário a EXECUTE AS instrução falha. Além disso, as permissões IMPERSONATE devem ser concedidas na entidade de segurança. A menos que o chamador seja o proprietário da base de dados, ou membro do papel fixo de servidor sysadmin, o principal deve existir mesmo quando o utilizador acede à base de dados ou instância de SQL Server através de uma pertença a um grupo Windows. Por exemplo, suponha as seguintes condições:
grupo CompanyDomain\SQLUsers tem acesso ao banco de dadosSales. CompanyDomain\SqlUser1 é membro do SQLUsers e, portanto, tem acesso implícito ao banco de dados Sales.
Embora
Se o utilizador for órfão (o login associado já não existir) e o utilizador não foi criado com WITHOUT LOGIN, EXECUTE AS falhará para o utilizador.
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 EXECUTE AS instrução pode ter sucesso desde que o Database Engine consiga resolver o nome. Se existir um utilizador de domínio, o Windows pode conseguir resolver o utilizador para o Database Engine, mesmo que o utilizador do Windows não tenha acesso ao SQL Server. Isto pode levar a uma condição em que um login sem acesso ao SQL Server pareça estar iniciado, embora o login personificado só tenha as permissões concedidas a público ou convidado.
Considerações de segurança
Executar sob o contexto de propriedade do dbo, por exemplo, usando a instrução EXECUTE AS USER = 'dbo', altera a forma como as permissões explícitas DENY são avaliadas. Quando mudas o contexto de execução para o contexto de propriedade do dbo, as restrições baseadas DENY em permissões que se aplicam ao principal original não são aplicadas durante a duração da personificação. Como resultado, um principal que pode mudar o contexto de execução para dbo, por exemplo através da pertença ao papel fixo de base de dados db_owner, pode realizar ações que de outra forma seriam bloqueadas por permissões explícitas DENY aplicadas a esse principal.
Este comportamento é intencional. Tenha isso em conta quando conceder permissões que permitam a suplantação de propriedade. DENY As permissões não podem servir como controlo compensatório para limitar as permissões efetivas dos principais que podem ser executados como DBO.
Usar WITH NO REVERT
Quando a EXECUTE AS instrução inclui a opcional cláusula WITH NO REVERT , o contexto de execução de uma sessão não pode ser reiniciado usando REVERT ou executando outra EXECUTE AS instrução. O contexto definido pela instrução permanece em vigor até que a sessão seja descartada.
Quando a cláusula SEM 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 instrução chamada REVERT WITH COOKIE = @varbinary_variable 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 EXECUTE AS instrução, este pode garantir que o contexto de execução que estabelece não pode ser alterado por mais ninguém.
Determinando o login original
Use a função ORIGINAL_LOGIN para devolver o nome do login que se ligou à instância de 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 EXECUTE AS num login, o interlocutor deve ter permissão de IMPERSONAGEM no nome de login especificado e não pode ser negado ao IMPERSONADO QUALQUER LOGIN permissão. Para especificar EXECUTE AS num utilizador da base de dados, o chamador deve ter permissões de IMPERSONAGEM no nome de utilizador especificado. Quando EXECUTE AS o CALLER é especificado, não são necessárias permissões de PERSONIFICAÇÃO .
Exemplos
Um. Usando EXECUTE AS e REVERT para mudar de 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
B. Utilização da cláusula WITH COOKIE
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