none
Dúvidas Execute as RRS feed

  • Pergunta

  • Bom, sou novo aqui no fórum e peço desculpas caso já tenham respondido à essa pergunta, mas não encontrei nada que resolvesse o problema que está ocorrendo.

    Vamos ao fato:

    Tenho um banco de dados que não pode ser acessado por um usuário específico, ele teria direito de executar apenas uma stored procedure.

    Na minha procedure está configurado com o comando  Execute as (usuario_com_acesso), porém ao executar esta procedure com o usuário restrito ou até mesmo com o próprio usuário que tem acesso, recebo a mensagem de que o a instrução select foi negada na tabela.

    Minhas dúvidas seriam:

    - como configurar de forma correta para que possa deixar o banco isolado deste usuário dando apenas a permissão específica nesta procedure?

    - Porque o usuário que tem permissão de executar a procedure, acaba dando erro se montar a procedure com o Execute as?

    Fico no aguardo de alguma ajuda. 

    Desde já, muito obrigado.

    quinta-feira, 14 de março de 2013 14:16

Respostas

  • Felippe,

    Se o erro for permissão de SELECT então você deverá ver as permissões do login no banco de dados, agora se o erro for permissão de execução faça o seguinte.

    GRANT SELECT ON OBJECT :: SAPOMMCBLIC005 TO saaudcon

    GRANT EXECUTE ON OBJECT :: dbo.sp_Diario_Test TO saaudcon

    GRANT EXECUTE ON OBJECT :: dbo.sp_Diario_Test TO OutroUsuario


    /* Se útil por favor classifique a resposta */

    quinta-feira, 14 de março de 2013 16:52

Todas as Respostas

  • Felippe, bom dia!

    Bem quando usamos o execute as dentro de algum encapsulamento de código é necessário se atentar as seguintes premissas:

    1 - Você pode utilizar EXECUTE AS USER ou EXECUTE AS LOGIN

    EXECUTE AS USER será executado com o usuário do banco de dados, Esse é interessante e funciona de fato somente para consultas no mesmo banco de dados ou seja, se estiver retornando todos o result set desejado do mesmo banco de dados, use esse caso isso.

    EXECUTE AS LOGIN será executado como o LOGIN da instância, esse é interessante quando você precisa ir em outros bancos de dados buscar as informações, só que para isso você terá que dar permissão para todos os objetos que o login deverá acessar na procedure. Ou seja primeira realiza o mapeamento do login para os bancos de dados que deseja e depois conceda acesso 

    2 - Além disso podemos ter problemas de TRUSTWORTHY.

     Essa configuração é o nível de confiabilidade com a instância de banco de dados. Quando alguma execução necessita de um nível maior de confiabilidade como: assemblies e outros o banco de dados precisa estar com essa opção habilitada.

    Nesse post é possível entender e ver como se habilita esse recurso - http://luanmorenodba.wordpress.com/2012/10/24/porque-utilizar-a-opo-trustworthy/

    Depois desses dois procedimentos executados você não terá problema.


    /* Se útil por favor classifique a resposta */

    quinta-feira, 14 de março de 2013 14:29
  • Luan, boa tarde!

    No meu caso, a opção seria utilizar o "execute as user", pois todos os dados são provenientes de um mesmo banco de dados.

    PROCEDURE [dbo].[sp_Diario_TESTE]
    
    @Ptabelanome varchar(50),
    @Pdata1 varchar(50),
    @Pdata2 varchar(50),
    @Pcentro varchar(50)
    with EXECUTE AS 'saaudcon'
    
    as
    
    -- ######### DECLARACAO DE  VARIAVEIS PARA SER USADA NA SP
    declare @sql varchar(4000)
    -- ######### MONTANDO SELECT BÁSICO 
    SET @SQL = 'SELECT * FROM ' + @Ptabelanome + ' WHERE 1=1 ' 

    A procedure continua, só não coloquei pois não acho que havia necessidade.

    Nesse contexto, o usuário 'saaudcon' tem acesso para realizar a consulta no banco de dados.

    Porém ao executar a procedure como outro usuário (ou até com o saaudcon), acaba gerando erro dizendo que não tem permissão de select.

    exec sp_Diario_TESTE sap0mmcblic005,'01.06.2012','31.12.2012',1050
    A permissão SELECT foi negada no objeto 'SAP0MMCBLIC005', banco de dados 'DEV_DB', esquema 'dbo'.
    Lembrando que se for realizada um select direto na tabela, funciona sem problemas.


    • Editado Felippe_wi3 quinta-feira, 14 de março de 2013 16:41
    quinta-feira, 14 de março de 2013 16:40
  • Felippe,

    Se o erro for permissão de SELECT então você deverá ver as permissões do login no banco de dados, agora se o erro for permissão de execução faça o seguinte.

    GRANT SELECT ON OBJECT :: SAPOMMCBLIC005 TO saaudcon

    GRANT EXECUTE ON OBJECT :: dbo.sp_Diario_Test TO saaudcon

    GRANT EXECUTE ON OBJECT :: dbo.sp_Diario_Test TO OutroUsuario


    /* Se útil por favor classifique a resposta */

    quinta-feira, 14 de março de 2013 16:52
  • Luan, 

    Eu jurava que já havia realizados as configurações no logon do banco de dados, mas resolvi dar uma conferida pois não sou o único a mexer nesse banco que ainda está em testes. E voilá! O usuário estava com permissões de denydatareader.

    Muito obrigado.

    quinta-feira, 14 de março de 2013 17:17
  • Perfeito meu amigo!

    Sempre que precisar conte conosco, se possível marque a resposta como útil!


    /* Se útil por favor classifique a resposta */

    quinta-feira, 14 de março de 2013 19:35