Log de exclusão de detalhe

23/01/2010

1

Pessoal,   Estou procurando algo que me ajude a desenvolver uma rotina de log de exclusão de itens de uma tabela detalhe.   Exemplificando: - Tenho uma tabela mestre ('Clientes') e tenho outra tabela detalhe ('Pedidos'), gostaria de gerar um log quando um pedido for excluído.   Minha dúvida - pensei em utilizar o evento onBeforeUpdateRecord do datasetprovider para isto, mas como saber qual clientdataset ele está usando pois tenho somente um datasetprovider em questão.   Utilizo D2005, Firebird e DBX.   Abraços   Rodolfo
Responder

Posts

eu particularmente faço rotinas de log via banco de dados, e muito mais seguro,e vc nao tem que ficar implementando isso em todo local no seu sistema.

Fiz um programa que automatiza o processo de criação das trigges, o programa cria um banco paralelo, e para cada tabela a ser auditada e criada outra de estrutura semelhante (com alguns campos a mais) e uma trigger no banco principal para incluir os logs nesse outro banco.
veja o ex de uma trigger.
obviamente nao da para fazer na unha uma dessas para cada tabela, mas com esse modelo vc pode criar o seu 'programinha' para criar as triggers.

infelismente nao tenho isso para firebird so para sql.
com seu conhecimento talvez vc consiga converter isso para o seu banco.

boa sorte.

 Create Trigger [dbo].[AUDIT_I_D_U_Estados] ON [dbo].[Estados]
 After UPDATE,DELETE,INSERT NOT FOR REPLICATION AS 
 Begin
 Set NOCOUNT ON
 Declare @Tipo as varchar(3)
 Declare @Qtd as Integer
 set @Qtd = @@ROWCOUNT
 if (select Count(*) from deleted)>0 and (select count(*) from inserted)>0
   Set @tipo='UPD' 
 if (select Count(*) from deleted)>0 and (select count(*) from inserted)=0 
   Set @tipo='DEL'
 if (select Count(*) from deleted)=0 and (select count(*) from inserted)>0
   Set @Tipo='INS'
  IF @Qtd = 1
    Begin
     IF @TIPO='UPD' 
      BEGIN 
      IF  (UPDATE ([UF])) OR  (UPDATE ([NomeEstado])) OR  (UPDATE ([Icms])) OR  (UPDATE ([Atualizacao])) OR  (UPDATE ([CodUsuario]))
       BEGIN
         INSERT INTO [RAD_AUDIT_SEUBANCO]..[Estados](Audit_DataHora,Audit_Origem,Audit_Computador,Audit_Operacao,[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario])
           SELECT GetDate(),app_name(),host_name(),'B',[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario] From Deleted
         INSERT INTO [RAD_AUDIT_SEUBANCO]..[Estados](Audit_DataHora,Audit_Origem,Audit_Computador,Audit_Operacao,[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario])
           SELECT GetDate(),app_name(),host_name(),'A',[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario] From Inserted
        END 
       END
     IF @TIPO='INS' 
      BEGIN 
        INSERT INTO [RAD_AUDIT_SEUBANCO]..[Estados](Audit_DataHora,Audit_Origem,Audit_Computador,Audit_Operacao,[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario])
          SELECT GetDate(),app_name(),host_name(),'I',[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario] From Inserted
      END 
     IF @TIPO='DEL' 
      BEGIN 
        INSERT INTO [RAD_AUDIT_SEUBANCO]..[Estados](Audit_DataHora,Audit_Origem,Audit_Computador,Audit_Operacao,[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario])
          SELECT GetDate(),app_name(),host_name(),'D',[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario] From Deleted
      END 
    End
  Else
    Begin
      declare @var1 varchar(2)
      declare @var2 varchar(20)
      declare @var3 varchar(5)
      declare @var4 datetime
      declare @var5 int

     IF @TIPO='DEL' 
      BEGIN 
        DECLARE dbmmCurD CURSOR FORWARD_ONLY READ_ONLY FOR SELECT [UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario] FROM Deleted
        OPEN dbmmCurD
        FETCH NEXT FROM dbmmCurD INTO  @var1, @var2, @var3, @var4, @var5
        WHILE @@FETCH_STATUS = 0
         BEGIN
            INSERT INTO [RAD_AUDIT_SEUBANCO]..[Estados](Audit_DataHora,Audit_Origem,Audit_Computador,Audit_Operacao,[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario])
                values(GetDate(),app_name(),host_name(),'D', @var1, @var2, @var3, @var4, @var5)
            FETCH NEXT FROM dbmmCurD INTO  @var1, @var2, @var3, @var4, @var5
         END
        CLOSE dbmmCurD
        DEALLOCATE dbmmCurD
      END 
     IF @TIPO='INS' 
      BEGIN 
        DECLARE dbmmCurI CURSOR FORWARD_ONLY READ_ONLY FOR SELECT [UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario] FROM Inserted
        OPEN dbmmCurI
        FETCH NEXT FROM dbmmCurI INTO  @var1, @var2, @var3, @var4, @var5
        WHILE @@FETCH_STATUS = 0
         BEGIN
            INSERT INTO [RAD_AUDIT_SEUBANCO]..[Estados](Audit_DataHora,Audit_Origem,Audit_Computador,Audit_Operacao,[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario])
                values(GetDate(),app_name(),host_name(),'I', @var1, @var2, @var3, @var4, @var5)
            FETCH NEXT FROM dbmmCurI INTO  @var1, @var2, @var3, @var4, @var5
         END
        CLOSE dbmmCurI
        DEALLOCATE dbmmCurI
      END 
     IF @TIPO='UPD' 
      BEGIN 
      IF  (UPDATE ([UF])) OR  (UPDATE ([NomeEstado])) OR  (UPDATE ([Icms])) OR  (UPDATE ([Atualizacao])) OR  (UPDATE ([CodUsuario]))
       BEGIN
        DECLARE dbmmCurD CURSOR FORWARD_ONLY READ_ONLY FOR SELECT [UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario] FROM Deleted
        DECLARE dbmmCurI CURSOR FORWARD_ONLY READ_ONLY FOR SELECT [UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario] FROM Inserted
        OPEN dbmmCurI
        OPEN dbmmCurD
        FETCH NEXT FROM dbmmCurD INTO  @var1, @var2, @var3, @var4, @var5
        While @@FETCH_STATUS = 0
          BEGIN
            INSERT INTO [RAD_AUDIT_SEUBANCO]..[Estados](Audit_DataHora,Audit_Origem,Audit_Computador,Audit_Operacao,[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario])
              Values(GetDate(),App_Name(),Host_Name(),'B', @var1, @var2, @var3, @var4, @var5)
            FETCH NEXT FROM dbmmCurI INTO  @var1, @var2, @var3, @var4, @var5

            INSERT INTO [RAD_AUDIT_SEUBANCO]..[Estados](Audit_DataHora,Audit_Origem,Audit_Computador,Audit_Operacao,[UF],[NomeEstado],[Icms],[Atualizacao],[CodUsuario])
              Values(GetDate(),App_Name(),Host_Name(),'A', @var1, @var2, @var3, @var4, @var5)
            FETCH NEXT FROM dbmmCurD INTO  @var1, @var2, @var3, @var4, @var5
          END
         CLOSE dbmmCurD
         CLOSE dbmmCurI
         DEALLOCATE dbmmCurD
         DEALLOCATE dbmmCurI
       END
      END
  END
 END

Responder
nesse evento, faça verificação dos parâmetros SourceDS ou DeltaDS:

if (UpdateKind = ukDelete) and (UpperCase(SourceDS.Name) = 'CLIENTDATASETPEDIDOS') then
   LOGPEDIDO(SourceDS.FieldByName('NumPedido').AsInteger)

ou

if (UpdateKind = ukDelete) and (UpperCase(DeltaDS.Name) = 'CLIENTDATASETPEDIDOS') then
   LOGPEDIDO(DeltaDS.FieldByName('NumPedido').AsInteger)

Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira