locked
Triggers para Log RRS feed

  • Pergunta

  • Pessoal,

    Estou criando uma estrutura de log para meu banco de dados atravéz de triggers. Andei pesquisando algumas coisas antes de começar, mais ainda acabei encontrando alguns problemas.

    Pelo que eu pesquisei, e pelo que eu preciso, achei interessante registrar as seguintes informações...

    declare @sqlcmd_log varchar(8000)	--
    		declare @domain_log nchar(128)		--
    		declare @usrdom_log nchar(128)		--
    		declare @host01_log nvarchar(128)	--
    		declare @prgram_log nvarchar		--
    		declare @loginn_log sysname			--
    		declare @usuari_log sysname			--
    		declare @spid01_log smallint		--
    		declare @procid_log int				--
    		declare @dbname_log nvarchar(128)	--
    		declare @datsis_log datetime		--
    
    SELECT @sqlcmd_log = CAST([TEXT] AS VARCHAR(8000))  FROM ::fn_get_sql((SELECT [sql_handle] FROM Master..SysProcesses where spid = @@spid))
    
    		
    		Select	@domain_log = NT_Domain,
    				@usrdom_log = NT_UserName,
    				@host01_log = HostName,
    				@prgram_log = PROGRAM_NAME(),
    				@loginn_log = SYSTEM_USER,
    				@usuari_log = CURRENT_USER,
    				@spid01_log = @@SPID,
    				@procid_log = @@PROCID,
    				@dbname_log = DB_NAME(dbid),
    				@datsis_log = CURRENT_TIMESTAMP				
    		From Master..SysProcesses


    A idéia é capturar estas informações do processo que dispara a trigger.

    Então eu criei triggers (uma para cada operação ) ...

    	Create trigger LogMovReceb_Upt on MovReceb after Update as
    		begin
    
    		set @tbname_log = 'MovReceb'
    		set @operac_log = 'U'
    
    		end
    ------------------------------------------------------
    
    	Create trigger LogMovReceb_Ins on MovReceb after Insert as
    		begin
    
    		set @tbname_log = 'MovReceb'
    		set @operac_log = 'I'
    
    		end
    -----------------------------------------------------------
    
    	Create trigger LogMovReceb_Del on MovReceb after Delete as
    		begin
    
    		set @tbname_log = 'MovReceb'
    		set @operac_log = 'D'
    
    		end



    em cada trigger, eu capturo as informações dispostas no primeiro bloco de código, as informações em cada trigger no segundo bloco de código além informações de identificação do registro que esta sendo alterado, inserido ou deletado, e faço inserção das informações na minha tabela de Log


    O problema é que as informações que estão sendo capturadas são a respeito do processo de execução da trigger, e não do processo que disparou a trigger.

    Por exemplo:

     * O comando sql capturado ( @sqlcmd_log ) é o código de execução da trigger, e não o código que disparou a trigger
     
     * O @@SPID capturado, é diferente do @@SPID do processo que eu estava quando executei um comando que dispara a trigger.


    Tem como capturar as informações do processo que disparou a trigger ?

    Tem como identificar se a trigger foi disparado por um comando Insert, Delete ou Update para que eu não precise criar uma trigger para cada comando? Ou seria melhor deixar uma trigger para cada comando ?

    Alguém poderia me explicar o que é o @@PROCID ? Porque processos com @@SPID diferentes as vezes possuem o mesmo @@PROCID ?

    Está seria uma das melhores maneiras de criar uma estrutura de monitoramento do meu Banco de Dados ?


    terça-feira, 23 de junho de 2009 12:05

Respostas

  • Boa tarde Miguel.

    Acredito que você consultando os registro na tabela inserted e depois fazer o insert na sua tabela de log é uma forma básica e rápida.

    Assista esta aula e veja se resolve seu problema: http://youtu.be/TmElq3oruFM

    []´s


    Drausio Henrique Chiarotti

    sexta-feira, 26 de julho de 2013 16:52

Todas as Respostas

  • Bom Dia,

    Um bom ponto de partida seria você informar qual versão você está usando.
    Alguns recursos estão disponíveis em algumas versões que não estão em outras

    [ ]s,

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

    Como importar e exportar imagens entre o SQL Server e o File System ? – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!612.entry
    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 23 de junho de 2009 12:21
  • OK,

    Desculpe por esquecer este detalhe.

    Utilizo Sql Server 2008 Enterprise
    terça-feira, 23 de junho de 2009 12:48
  • Boa tarde Miguel.

    Acredito que você consultando os registro na tabela inserted e depois fazer o insert na sua tabela de log é uma forma básica e rápida.

    Assista esta aula e veja se resolve seu problema: http://youtu.be/TmElq3oruFM

    []´s


    Drausio Henrique Chiarotti

    sexta-feira, 26 de julho de 2013 16:52