Usando EXECUTE AS em módulos

EXECUTE AS pode ser usado para definir o contexto de execução dos seguintes módulos definidos pelo usuário: funções, procedimentos, filas e gatilhos. Por exemplo, o contexto de execução pode ser alternado do chamador do módulo para o proprietário do módulo, ou para um usuário especificado. Em versões anteriores do SQL Server, esses módulos sempre são executados no contexto do chamador do módulo.

Especificando o contexto no qual o módulo é executado, você pode controlar qual conta de usuário o Mecanismo de Banco de Dados usa para validar permissões em quaisquer objetos referenciados pelo módulo. 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. Os usuários do módulo só precisam de permissões para executar o próprio módulo; não são necessárias permissões explícitas nos objetos referenciados. Somente o usuário que o módulo está representando tem permissões nos objetos acessados pelo módulo.

EXECUTE AS CALLER

EXECUTE AS CALLER especifica que as instruções do módulo são executadas no contexto do chamador do módulo.

Use EXECUTE AS CALLER nos seguintes cenários:

  • Você deseja que as instruções do módulo sejam executadas como o usuário chamador.

  • Você deseja basear as verificações de permissão das instruções do módulo no usuário chamador, e contar com um encadeamento de propriedades para ignorar verificações de permissão em objetos subjacentes. Lembre-se de que o encadeamento de propriedades se aplica somente às instruções DML. Para obter mais informações sobre encadeamento de propriedades, consulte Cadeias de propriedade.

  • Seu aplicativo não requer que os objetos referenciados subjacentes sejam ocultados do usuário, ou você só referencia objetos de mesma propriedade e, portanto, pode contar com o encadeamento de propriedades para ocultar o esquema.

  • Você deseja preservar o comportamento do SQL Server 2000.

Cenário EXECUTE AS CALLER

Mary cria um procedimento armazenado que referencia uma tabela que não é de sua propriedade, mas na qual tem permissões SELECT. Ela especifica EXECUTE AS CALLER na instrução CREATE PROCEDURE, como mostra este exemplo:

CREATE PROCEDURE AccessTable
WITH EXECUTE AS CALLER
AS SELECT * FROM dbo.SomeTable;

Mary então concede a Scott permissões EXECUTE no procedimento armazenado. Quando Scott executa o procedimento armazenado, o Mecanismo de Banco de Dados verifica que ele (o chamador) tem permissão para executar o procedimento armazenado. Scott tem a permissão EXECUTE, mas como Mary não é proprietária da tabela referenciada, o Mecanismo de Banco de Dados verifica se Scott tem permissões na tabela. Se Scott não tiver permissões, haverá falha na instrução do procedimento armazenado.

EXECUTE AS user_name

EXECUTE AS user_name especifica as instruções do módulo execute no contexto do usuário especificado em user_name.

Use EXECUTE AS user_name nos seguintes cenários:

  • Você deseja que as instruções do módulo sejam executadas no contexto de um usuário especificado.

  • Você não pode contar com o encadeamento de propriedades (por exemplo, o módulo acessa objetos com propriedades diferentes) para ocultar o esquema subjacente, e quer evitar conceder permissões nesses objetos referenciados.

  • Você deseja criar um conjunto de permissões personalizado. Por exemplo, para fornecer permissões para operações de DDL para as quais não é possível conceder permissões específicas normalmente. Para obter mais informações, consulte Usando EXECUTE AS para criar conjuntos de permissão personalizados.

    ObservaçãoObservação

    Um usuário especificado como o contexto de execução de um módulo não pode ser descartado até que o contexto de execução desse módulo seja alterado.

Cenário EXECUTE AS user_name

Mary cria um procedimento armazenado que referencia uma tabela que não é de sua propriedade, mas na qual tem permissões SELECT. Ela especifica EXECUTE AS 'Mary' na instrução CREATE PROCEDURE, como mostra este exemplo:

CREATE PROCEDURE AccessMyTable
WITH EXECUTE AS 'Mary'
AS SELECT * FROM dbo.MyTable;

Mary concede a Scott permissões EXECUTE no procedimento armazenado. Quando Scott executa o procedimento armazenado, o Mecanismo de Banco de Dados verifica se ele tem permissão para executar o procedimento armazenado; no entanto, as permissões para a tabela referenciada são verificadas para Mary. Nesse cenário, embora Scott não tenha permissões SELECT diretamente na tabela, ele poderá acessar os dados por intermédio do procedimento, pois Mary, em cujo contexto o procedimento está sendo executado, tem permissões para acessar os dados da tabela.

EXECUTE AS SELF

EXECUTE AS SELF equivale a EXECUTE AS user_name, onde o usuário especificado é a pessoa que cria ou modifica o módulo.

Use EXECUTE AS SELF nos seguintes cenários:

  • Você deseja um atalho para especificar você mesmo como o usuário em cujo contexto deseja executar as instruções do módulo que você está criando ou modificando para ser executado como.

  • Existe um aplicativo que cria módulos para usuários que fazem chamadas para ele, e você deseja que esses módulos sejam criados usando esses usuários como contexto de execução. Nesse cenário, você não sabe, em tempo de design, qual é o nome do usuário chamador.

EXECUTE AS OWNER

EXECUTE AS OWNER especifica que as instruções do módulo são executadas no contexto do proprietário atual do módulo. Se o módulo não tiver um proprietário especificado, o proprietário do esquema do módulo será usado.

Use EXECUTE AS OWNER no seguinte cenário:

  • Você deseja poder alterar o proprietário do módulo sem ter que modificar o próprio módulo. Ou seja, OWNER mapeia automaticamente para o proprietário atual do módulo em tempo de execução.

OWNER é o proprietário explícito do módulo, ou, se não houver um proprietário explícito, é o proprietário do esquema do módulo no momento em que o módulo é executado. OWNER deve ser uma conta singleton e não um grupo ou uma função. A propriedade do módulo não pode ser alterada para um grupo ou uma função quando o módulo especificar EXECUTE AS OWNER e tiver um proprietário explícito. A propriedade de um esquema não pode ser alterada para uma função ou um grupo quando ela contiver um módulo que especifique EXECUTE AS OWNER e os módulos não tiverem um proprietário explícito.

Cenário EXECUTE AS OWNER

Mary cria um procedimento armazenado que referencia uma tabela de sua propriedade. Ela especifica EXECUTE AS OWNER na instrução CREATE PROCEDURE, como mostra este exemplo:

CREATE PROCEDURE Mary.AccessMyTable
WITH EXECUTE AS OWNER
AS SELECT * FROM Mary.MyTable;

Mary concede a Scott permissões EXECUTE no procedimento armazenado. Quando Scott executa o procedimento armazenado, o Mecanismo de Banco de Dados verifica se ele tem permissão para executar o procedimento armazenado; no entanto, as permissões para a tabela referenciada são verificadas para Mary, porque ela é a proprietária atual do procedimento. Mary decide sair da empresa e altera a propriedade do procedimento e da tabela para Tom. Quando Scott executar o procedimento armazenado após a alteração na propriedade, ele ainda conseguirá acessar os dados por meio do procedimento, porque OWNER é automaticamente mapeado para Tom.