none
Trigger RRS feed

  • Pergunta

  • Olá novamente pessoal!!!

     

    Pesquisando, consegui criar um trigger para fazer o monitoramento de UPDATES em uma tabela, está logando certinho. Entretanto, agora o usuário da aplicação está retornando o seguinte erro ao executar um UPDATE na tabela monitorada:

     

    Msg 297, Level 16, State 1, Line 1

    The user does not have permission to perform this action.

    Acredito que seja porque o usuário não tem permissão de SELECT na view (sys.dm.exec.connections) mas, eu dei GRANT de SELECT na mesma para o user da aplicação e mesmo assim continua o erro. Ele gera este erro quando entra nesta parte do trigger:

    SELECT      USER AS UserName, 

                SYSTEM_USER AS LoginName,

                HOST_NAME() AS HostName,

                CURRENT_TIMESTAMP AS CurrentTime,

                client_net_address

                FROM sys.dm_exec_connections

     

    Segue o código do trigger:

     

    CREATE TRIGGER [dbo].[trg_parapapa]

    ON [dbo].[tabela]

    AFTER UPDATE AS

     

    DECLARE @maq VARCHAR(200)

     SET @maq = (SELECT HOST_NAME() AS HostName)

     IF UPDATE(campo) AND

      @maq <> 'server1' AND

      @maq <> 'server2'

     

          BEGIN

                 SET NOCOUNT ON

                 DECLARE @cmd_exec VARCHAR(MAX),

                             @query NVARCHAR(MAX)

                 

                 CREATE TABLE #inputbuffer

                 (

                  EventType NVARCHAR(MAX),

                  Parameters INT,

                  EventInfo NVARCHAR(MAX)

                 )

                 SET @cmd_exec = 'DBCC INPUTBUFFER(' + STR(@@SPID) + ')'  + WITH NO_INFOMSGS

                 INSERT INTO #inputbuffer

                 EXEC (@cmd_exec)

                 

                 SET @query = (SELECT EventInfo FROM #inputbuffer)

                 INSERT INTO master.dbo.Log_Upd

                 SELECT USER AS UserName, 

                    SYSTEM_USER AS LoginName,

                    HOST_NAME() AS HostName,

                    CURRENT_TIMESTAMP AS CurrentTime,

                    @query,

                            client_net_address

                            FROM master.sys.dm_exec_connections

          END

     

    Poderiam por gentileza me dar uma dica??? Desde já agradeço pela ajuda e atenção.

     

    Abraço,

     

    Paulo Henrique.

     

    quarta-feira, 30 de dezembro de 2009 20:28

Respostas

  • Bom dia Paulo, você está correto, o problema é na sys.dm.exec.connections , para o caso do dbcc inputbuffer não teria problema já que o trigger observa o buffer do próprio SPID , então para o primeiro caso, você deverá executar o comando abaixo para o login que está executando a transação:

    GRANT VIEW SERVER STATE TO [LOGIN] 
    
    GO


    Abraços


    ANDRÉ ROCHA
    • Sugerido como Resposta Andre Felipe Rocha quinta-feira, 31 de dezembro de 2009 11:35
    • Marcado como Resposta phscuritiba segunda-feira, 4 de janeiro de 2010 12:16
    quinta-feira, 31 de dezembro de 2009 10:50
  • Boa Noite,

    Eu seria um pouco mais cauteloso em relação a essa permissão. Conceder permissão de View Server State permitirá que a trigger funcione e que não haja problemas em relação ao Inputbuffer mas isso também concederá ao usuário permissão de ver muito mais coisa do que a trigger necessita. Considere o uso da opção Execute As User para permitir o acesso na trigger, mas não conceder permissões fora dela.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte III
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!899.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta phscuritiba terça-feira, 5 de janeiro de 2010 12:37
    terça-feira, 5 de janeiro de 2010 00:37

Todas as Respostas

  • Paulo,

    Provavelmente o usuário que esta logado no banco fazendo acesso a table que contém o trigger não tem permissão para executar alguma instrução de trigger.

    Acredito que seja o comando DBCC Inputbuffer!!!!
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 31 de dezembro de 2009 03:23
    Moderador
  • Bom dia Paulo, você está correto, o problema é na sys.dm.exec.connections , para o caso do dbcc inputbuffer não teria problema já que o trigger observa o buffer do próprio SPID , então para o primeiro caso, você deverá executar o comando abaixo para o login que está executando a transação:

    GRANT VIEW SERVER STATE TO [LOGIN] 
    
    GO


    Abraços


    ANDRÉ ROCHA
    • Sugerido como Resposta Andre Felipe Rocha quinta-feira, 31 de dezembro de 2009 11:35
    • Marcado como Resposta phscuritiba segunda-feira, 4 de janeiro de 2010 12:16
    quinta-feira, 31 de dezembro de 2009 10:50
  • Caros,

    muito obrigado pela ajuda.

    André, executei o comando mencionado e agora não gera mais o erro executando pelo banco, vamos aguardar os processos que rodam pelas as aplicações.

    Abraço,

    Paulo Henrique.
    segunda-feira, 4 de janeiro de 2010 12:20
  • Boa Noite,

    Eu seria um pouco mais cauteloso em relação a essa permissão. Conceder permissão de View Server State permitirá que a trigger funcione e que não haja problemas em relação ao Inputbuffer mas isso também concederá ao usuário permissão de ver muito mais coisa do que a trigger necessita. Considere o uso da opção Execute As User para permitir o acesso na trigger, mas não conceder permissões fora dela.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte III
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!899.entry


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta phscuritiba terça-feira, 5 de janeiro de 2010 12:37
    terça-feira, 5 de janeiro de 2010 00:37
  • Olá Gustavo,

    muito obrigado pela dica e ajuda sobre mais essa dúvida.

    Abraço,

    PH.
    terça-feira, 5 de janeiro de 2010 12:37