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

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure SQL nãoAzure Synapse Analytics (SQL DW) nãoData Warehouse Paralelo APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

No SQL ServerSQL Server, é possível definir o contexto de execução dos seguintes módulos definidos pelo usuário: funções (exceto com valor de tabela embutida), procedimentos, filas e gatilhos.In SQL ServerSQL Server you can define the execution context of the following user-defined modules: functions (except inline table-valued functions), procedures, queues, and triggers.

Especificando o contexto no qual o módulo é executado, você pode controlar qual conta de usuário o Mecanismo de Banco de DadosDatabase Engine usa para validar permissões em objetos referenciados pelo módulo.By specifying the context in which the module is executed, you can control which user account the Mecanismo de Banco de DadosDatabase Engine uses to validate permissions on objects that are referenced by the module. Isso dá mais flexibilidade e controle no gerenciamento de permissões na cadeia de objetos existente entre os módulos definidos pelo usuário e os objetos referenciados por esses módulos.This provides additional flexibility and control in managing permissions across the object chain that exists between user-defined modules and the objects referenced by those modules. A permissões devem ser concedidas a usuários somente no próprio módulo, sem necessitar conceder permissões explícitas nos objetos referenciados.Permissions must be granted to users only on the module itself, without having to grant them explicit permissions on the referenced objects. Somente o usuário que o módulo está representando tem permissões nos objetos acessados pelo módulo.Only the user that the module is running as must have permissions on the objects accessed by the module.

Ícone de link do tópico Convenções da sintaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- SQL Server Syntax  
Functions (except inline table-valued functions), Stored Procedures, and DML Triggers  
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }   
  
DDL Triggers with Database Scope  
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }   
  
DDL Triggers with Server Scope and logon triggers  
{ EXEC | EXECUTE } AS { CALLER | SELF | 'login_name' }   
  
Queues  
{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }   
  
-- Azure SQL Database Syntax  
Functions (except inline table-valued functions), Stored Procedures, and DML Triggers  
  
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }   
  
DDL Triggers with Database Scope  
  
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }  
  

ArgumentosArguments

CALLERCALLER
Especifica que as instruções do módulo são executadas no contexto do chamador do módulo.Specifies the statements inside the module are executed in the context of the caller of the module. O usuário executando o módulo deve ter permissões apropriadas não apenas no módulo em si, mas também em qualquer objeto que seja referenciado pelo módulo.The user executing the module must have appropriate permissions not only on the module itself, but also on any database objects that are referenced by the module.

CALLER é o padrão para todos os módulos, exceto filas, e tem o mesmo comportamento que no SQL Server 2005 (9.x)SQL Server 2005 (9.x).CALLER is the default for all modules except queues, and is the same as SQL Server 2005 (9.x)SQL Server 2005 (9.x) behavior.

CALLER não pode ser especificado em uma instrução CREATE QUEUE ou ALTER QUEUE.CALLER cannot be specified in a CREATE QUEUE or ALTER QUEUE statement.

SELFSELF
EXECUTE AS SELF equivale a EXECUTE AS user_name, em que o usuário especificado é a pessoa que cria ou altera o módulo.EXECUTE AS SELF is equivalent to EXECUTE AS user_name, where the specified user is the person creating or altering the module. A ID de usuário real da pessoa que cria ou modifica os módulos é armazenada na coluna execute_as_principal_id da exibição do catálogo sys.sql_modules ou sys.service_queues.The actual user ID of the person creating or modifying the modules is stored in the execute_as_principal_id column in the sys.sql_modules or sys.service_queues catalog view.

SELF é o padrão para filas.SELF is the default for queues.

Observação

Para alterar a ID de usuário de execute_as_principal_id da exibição do catálogo sys.service_queues, é necessário especificar explicitamente a configuração EXECUTE AS na instrução ALTER QUEUE.To change the user ID of the execute_as_principal_id in the sys.service_queues catalog view, you must explicitly specify the EXECUTE AS setting in the ALTER QUEUE statement.

OWNEROWNER
Especifica que as instruções do módulo são executadas no contexto do proprietário atual do módulo.Specifies the statements inside the module executes in the context of the current owner of the module. Se o módulo não tiver um proprietário especificado, o proprietário do esquema do módulo será usado.If the module does not have a specified owner, the owner of the schema of the module is used. OWNER não pode ser especificado para gatilhos DDL ou de logon.OWNER cannot be specified for DDL or logon triggers.

Importante

OWNER deve mapear a uma conta singleton e não deve ser uma função ou grupo.OWNER must map to a singleton account and cannot be a role or group.

' user_name '' user_name '
Especifica que as instruções dentro do módulo sejam executadas no contexto do usuário especificado em user_name.Specifies the statements inside the module execute in the context of the user specified in user_name. As permissões de qualquer objeto dentro do módulo são verificadas em relação a user_name.Permissions for any objects within the module are verified against user_name. user_name não pode ser especificado para gatilhos DDL com escopo de servidor ou gatilhos de logon.user_name cannot be specified for DDL triggers with server scope or logon triggers. Use login_name.Use login_name instead.

user_name deve existir no banco de dados atual e deve ser uma conta singleton.user_name must exist in the current database and must be a singleton account. user_name não pode ser um grupo, uma função, um certificado, uma chave ou conta interna, como NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService ou NT AUTHORITY\LocalSystem.user_name cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

A ID de usuário do contexto de execução é armazenada em metadados e pode ser exibida na coluna execute_as_principal_id da exibição do catálogo sys.sql_modules ou sys.assembly_modules.The user ID of the execution context is stored in metadata and can be viewed in the execute_as_principal_id column in the sys.sql_modules or sys.assembly_modules catalog view.

' login_name '' login_name '
Especifica que as instruções do módulo sejam executadas no contexto do logon do SQL ServerSQL Server especificado em login_name.Specifies the statements inside the module execute in the context of the SQL ServerSQL Server login specified in login_name. As permissões de qualquer objeto dentro do módulo são verificadas em relação a login_name.Permissions for any objects within the module are verified against login_name. login_name pode ser especificado apenas para gatilhos DDL com escopo de servidor ou gatilhos de logon.login_name can be specified only for DDL triggers with server scope or logon triggers.

login_name não pode ser um grupo, uma função, um certificado, uma chave ou conta interna, como NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService ou NT AUTHORITY\LocalSystem.login_name cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

ComentáriosRemarks

A forma como o Mecanismo de Banco de DadosDatabase Engine avalia as permissões nos objetos que são referenciados no módulo depende da cadeia de propriedade que existente entre os objetos de chamada e os objetos referenciados.How the Mecanismo de Banco de DadosDatabase Engine evaluates permissions on the objects that are referenced in the module depends on the ownership chain that exists between calling objects and referenced objects. Nas versões anteriores do SQL ServerSQL Server, a cadeia de propriedade era o único método disponível para não ter de conceder ao usuário chamador acesso a todos os objetos referenciados.In earlier versions of SQL ServerSQL Server, ownership chaining was the only method available to avoid having to grant the calling user access to all referenced objects.

A cadeia de propriedade tem as seguintes limitações:Ownership chaining has the following limitations:

  • Aplica-se somente a instruções DML: SELECT, INSERT, UPDATE e DELETE.Applies only to DML statements: SELECT, INSERT, UPDATE, and DELETE.

  • Os proprietários da chamada e os objetos chamados devem ser os mesmos.The owners of the calling and the called objects must be the same.

  • Não se aplica a consultas dinâmicas no módulo.Does not apply to dynamic queries inside the module.

Independentemente do contexto de execução especificado no módulo, as seguintes ações sempre se aplicam:Regardless of the execution context that is specified in the module, the following actions always apply:

  • Quando o módulo é executado, o Mecanismo de Banco de DadosDatabase Engine primeiro verifica se o usuário executando o módulo tem a permissão EXECUTE no módulo.When the module is executed, the Mecanismo de Banco de DadosDatabase Engine first verifies that the user executing the module has EXECUTE permission on the module.

  • As regras de cadeia de propriedade continuam aplicáveis.Ownership chaining rules continue to apply. Isso significa que, se os proprietários dos objetos chamadores e chamados são os mesmos, nenhuma permissão é verificada nos objetos subjacentes.This means if the owners of the calling and called objects are the same, no permissions are checked on the underlying objects.

Quando um usuário executa um módulo que foi especificado para ser executado em um contexto diferente de CALLER, a permissão do usuário para executar o módulo é verificada, mas as verificações de permissões adicionais nos objetos que são acessados pelo módulo são executadas na conta de usuário especificada na cláusula EXECUTE AS.When a user executes a module that has been specified to run in a context other than CALLER, the user's permission to execute the module is checked, but additional permissions checks on objects that are accessed by the module are performed against the user account specified in the EXECUTE AS clause. O usuário que executa o módulo está, na verdade, representando o usuário especificado.The user executing the module is, in effect, impersonating the specified user.

O contexto especificado na cláusula EXECUTE AS do módulo é válido somente para a duração da execução do módulo.The context specified in the EXECUTE AS clause of the module is valid only for the duration of the module execution. O contexto é revertido ao chamador quando a execução de módulo é concluída.Context reverts to the caller when the module execution is completed.

Especificando um nome de logon ou usuárioSpecifying a User or Login Name

Um usuário de banco de dados ou logon de servidor especificado na cláusula EXECUTE AS de um módulo não pode ser descartado até que o módulo seja modificado para ser executado em outro contexto.A database user or server login specified in the EXECUTE AS clause of a module cannot be dropped until the module has been modified to execute under another context.

O nome de usuário ou de logon especificado na cláusula EXECUTE AS deverá existir como uma entidade de segurança em sys.database_principals ou sys.server_principals, respectivamente, caso contrário, a operação de criação ou alteração do módulo falhará.The user or login name specified in EXECUTE AS clause must exist as a principal in sys.database_principals or sys.server_principals, respectively, or else the create or alter module operation fails. Além disso, o usuário que cria ou altera o módulo deve ter as permissões IMPERSONATE no principal.Additionally, the user that creates or alters the module must have IMPERSONATE permissions on the principal.

Se o usuário tiver acesso implícito ao banco de dados ou à instância do SQL ServerSQL Server através de uma associação de grupo do Windows, o usuário especificado na cláusula EXECUTE AS será criado implicitamente quando o modulo for criado, caso um dos seguintes requisitos exista:If the user has implicit access to the database or instance of SQL ServerSQL Server through a Windows group membership, the user specified in the EXECUTE AS clause is implicitly created when the module is created when one of the following requirements exist:

  • O usuário ou logon especificado é um membro da função de servidor fixa sysadmin.The specified user or login is a member of the sysadmin fixed server role.

  • O usuário que está criando o módulo tem permissão para criar os principais.The user that is creating the module has permission to create principals.

Quando nenhum desses requisitos é atendido, a operação de criar o módulo falha.When neither of these requirements are met, the create module operation fails.

Importante

Se o serviço do SQL ServerSQL Server (MSSQLSERVER) for executado em uma conta local (serviço local ou conta de usuário local), ele não terá privilégios para obter associações de grupo de uma conta de domínio do Windows que for especificada na cláusula EXECUTE AS.If the SQL ServerSQL Server (MSSQLSERVER) service is running as a local account (local service or local user account), it will not have privileges to obtain the group memberships of a Windows domain account that is specified in the EXECUTE AS clause. Isso fará a execução do módulo falhar.This will cause the execution of the module to fail.

Por exemplo, considere as seguintes condições:For example, assume the following conditions:

  • O grupo CompanyDomain\SQLUsers tem acesso ao banco de dados Sales.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1 é membro de SQLUsers e, portanto, tem acesso ao banco de dados Sales.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has access to the Sales database.

  • O usuário que está criando ou está alterando o módulo tem permissões para criar os principais.The user that is creating or altering the module has permissions to create principals.

Quando a seguinte instrução CREATE PROCEDURE é executada, o CompanyDomain\SqlUser1 é implicitamente criado como um principal de banco de dados no banco de dados Sales.When the following CREATE PROCEDURE statement is run, the CompanyDomain\SqlUser1 is implicitly created as a database principal in the Sales database.

USE Sales;  
GO  
CREATE PROCEDURE dbo.usp_Demo  
WITH EXECUTE AS 'CompanyDomain\SqlUser1'  
AS  
SELECT user_name();  
GO  

Usando a instrução autônoma EXECUTE AS CALLERUsing EXECUTE AS CALLER Stand-Alone Statement

Use a instrução autônoma EXECUTE AS CALLER em um módulo ao definir o contexto de execução para o chamador do módulo.Use the EXECUTE AS CALLER stand-alone statement inside a module to set the execution context to the caller of the module.

Suponha que o procedimento armazenado a seguir seja chamado de SqlUser2.Assume the following stored procedure is called by SqlUser2.

CREATE PROCEDURE dbo.usp_Demo  
WITH EXECUTE AS 'SqlUser1'  
AS  
SELECT user_name(); -- Shows execution context is set to SqlUser1.  
EXECUTE AS CALLER;  
SELECT user_name(); -- Shows execution context is set to SqlUser2, the caller of the module.  
REVERT;  
SELECT user_name(); -- Shows execution context is set to SqlUser1.  
GO  

Usando EXECUTE AS para definir conjuntos de permissões personalizadasUsing EXECUTE AS to Define Custom Permission Sets

Especificar um contexto de execução para um módulo pode ser muito útil quando ao definir conjuntos de permissões personalizadas.Specifying an execution context for a module can be very useful when you want to define custom permission sets. Por exemplo, algumas ações, como TRUNCATE TABLE, não têm permissões concessíveis.For example, some actions, such as TRUNCATE TABLE, do not have grantable permissions. Incorporando a instrução TRUNCATE TABLE em um módulo e especificando que o módulo execute como um usuário que tem permissões para alterar a tabela, você pode estender as permissões para truncar a tabela para o usuário ao qual fora, concedidas permissões EXECUTE no módulo.By incorporating the TRUNCATE TABLE statement within a module and specifying that module execute as a user who has permissions to alter the table, you can extend the permissions to truncate the table to the user to whom you grant EXECUTE permissions on the module.

Para exibir a definição do módulo com o contexto de execução especificado, use a exibição do catálogo sys.sql_modules (Transact-SQL).To view the definition of the module with the specified execution context, use the sys.sql_modules (Transact-SQL) catalog view.

Melhor práticaBest Practice

Especifica um logon ou usuário com os privilégios mínimos exigidos para executar as operações definidos no módulo.Specify a login or user that has the least privileges required to perform the operations defined in the module. Por exemplo, não especifique uma conta de proprietário de banco de dados a menos que essas permissões sejam necessárias.For example, do not specify a database owner account unless those permissions are required.

PermissõesPermissions

Para executar um módulo especificado com EXECUTE AS, o chamador precisar ter permissões EXECUTE no módulo.To execute a module specified with EXECUTE AS, the caller must have EXECUTE permissions on the module.

Para executar um módulo CLR especificado com EXECUTE AS que acesse recursos em outro banco de dados ou servidor, o banco de dados ou servidor de destino deve confiar no autenticador do banco de dados do qual o módulo origina (o banco de dados de origem).To execute a CLR module specified with EXECUTE AS that accesses resources in another database or server, the target database or server must trust the authenticator of the database from which the module originates (the source database).

Para especificar a cláusula EXECUTE AS ao criar ou modificar um módulo, é necessário ter as permissões IMPERSONATE no principal especificado e também permissões para criar o módulo.To specify the EXECUTE AS clause when you create or modify a module, you must have IMPERSONATE permissions on the specified principal and also permissions to create the module. Você sempre pode se representar.You can always impersonate yourself. Quando nenhum contexto de execução é especificado ou EXECUTE AS CALLER é especificado, as permissões de IMPERSONATE não são obrigatórias.When no execution context is specified or EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

Para especificar um login_name ou user_name que tem acesso implícito ao banco de dados por meio de uma associação a um grupo do Windows, é necessário ter permissões CONTROL no banco de dados.To specify a login_name or user_name that has implicit access to the database through a Windows group membership, you must have CONTROL permissions on the database.

ExemplosExamples

O exemplo a seguir cria um procedimento armazenado no banco de dados AdventureWorks2012AdventureWorks2012 e atribui o contexto de execução a OWNER.The following example creates a stored procedure in the AdventureWorks2012AdventureWorks2012 database and assigns the execution context to OWNER.

CREATE PROCEDURE HumanResources.uspEmployeesInDepartment   
@DeptValue int  
WITH EXECUTE AS OWNER  
AS  
    SET NOCOUNT ON;  
    SELECT e.BusinessEntityID, c.LastName, c.FirstName, e.JobTitle  
    FROM Person.Person AS c   
    INNER JOIN HumanResources.Employee AS e  
        ON c.BusinessEntityID = e.BusinessEntityID  
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh  
        ON e.BusinessEntityID = edh.BusinessEntityID  
    WHERE edh.DepartmentID = @DeptValue  
    ORDER BY c.LastName, c.FirstName;  
GO  
  
-- Execute the stored procedure by specifying department 5.  
EXECUTE HumanResources.uspEmployeesInDepartment 5;  
GO  
  

Consulte TambémSee Also

sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.service_queues (Transact-SQL) sys.service_queues (Transact-SQL)
REVERT (Transact-SQL) REVERT (Transact-SQL)
EXECUTE AS (Transact-SQL)EXECUTE AS (Transact-SQL)