Log de exclusão de detalhe
23/01/2010
0
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
Rodolfo Gatzke
Curtir tópico
+ 0
Responder
Posts
25/01/2010
Rad Informatica
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
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
25/01/2010
Emerson Nascimento
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)
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
Clique aqui para fazer login e interagir na Comunidade :)