trigger com linha dupla
- boa tarde senhores.
Criei o trigger abaixo para uma auditoria, porem cada vez que disparo um update na tabela, duas linhas são adicionadas na tabela de auditoria.
Poderiam me exclarecer por que duas linhas são adicionados e não apenas uma?
Obrigado
CREATE
TRIGGER [tr_BomRiscoPergEmis_IUD]
ON BomRiscoPergEmis for INSERT,DELETE,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- DISPARO DE INSERÇÃO
if (select count(*) from inserted) > 0 and (select count(*) from deleted) = 0
begin
insert BomRiscoPergEmis_acao values ('I',getdate())
end
-- DISPARO DE EXCLUSÃO
if (select count(*) from inserted) = 0 and (select count(*) from deleted) > 0
begin
insert BomRiscoPergEmis_acao values ('D',getdate())
end
-- DISPARO DE ALTERAÇÃO
if (select count(*) from inserted) > 0 and (select count(*) from deleted) > 0
begin
insert BomRiscoPergEmis_acao values ('U',getdate())
end
END
GO
Respostas
- Senhores,
Uma outra trigger estava sendo disparada e gerando a segunda linha.
Agradeço a atenção.
Obrigado.- Marcado como RespostaCorujao terça-feira, 3 de novembro de 2009 19:42
Todas as Respostas
- Corujão, um Update no banco de dados é considerado pela TRigger como um Delete (registro antes do update) depois um Insert (registro depois do update), então no seu codigo é feito o Insert na tabela de auditoria 2 vezes
Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/ - ate cogitei isto. Mas veja o resultado da tabela de apoio apos alguns update na tabela principal:
U 2009-11-03 16:48:42.223
U 2009-11-03 16:48:42.257
U 2009-11-03 16:49:11.410
U 2009-11-03 16:49:11.427
U 2009-11-03 16:54:16.960
U 2009-11-03 16:54:16.960
São dois registros de update e não um de delete e outro de insert - Corujão,
Então possível alguma condição dentro da sua trigger esta sendo identificada pelo SQL Server no Update que acaba resultando na inserção de dois registros.
Você as condições impostas no comando IF!!!
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA - Senhores,
Uma outra trigger estava sendo disparada e gerando a segunda linha.
Agradeço a atenção.
Obrigado.- Marcado como RespostaCorujao terça-feira, 3 de novembro de 2009 19:42
Corujão, mas é exatamete isso... Ele passa 2 vezes, uma para Delete e outra p/ Insert e vc testa isso....
(select count(*) from inserted) > 0 and (select count(*) from deleted) > 0
Create Table tblTeste
(idTeste Int Identity(1, 1),
dsTeste VarChar(20)
)Create Trigger trgtblTeste
On tblTeste for INSERT,DELETE,UPDATEAS
BEGINselect count(*) from inserted
select count(*) from deleted
EndInsert Into tblTeste Values ('AAAAAAAAAAAaa')
Go
Update tblTeste set dsTeste = 'bbbbbbbbb'
Go
Delete tblTeste
Tks. Fausto Fiorese Branco DBA - SQL Server 2k5 São Paulo - Brasil * http://dba-sqlserver.blogspot.com/- Fausto, minha trigger ja faz este teste.
Veja a trigger completa no primeiro post, la em cima.
Ja achei o problema (vide um pouco acima). Obrigado por sua atenção.
Abraços. Para constar, dropei a trigger ja existente e a trigger mostrada acima passou a inserir apenas uma linha na tabela auxiliar.
Obrigado a todos.- Fausto,
Eu particularmente já trabalhei com diversas formas de aplicação de trigger mas eu particularmente não tive a curiosidade de observar o que ocorre quando utilizamos um Update.
Se analisar um plano de execução com uma instrução de Update não é apresentado este comportamento de excluir o antigo registro e adicionar um novo.
Mas eu já havia estudado o comportamento dos processos de Update e Delete.
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA - bom dia senhores.
Fausto e Galvão, pode ser que internamente seja feito um delete e insert quando e feita um update na tabela.
Mas quando o trigger é disparado, apenas uma linha com 'U' é inserida na minha tabela auxiliar.
(vide trigger no primeiro post)
Obrigado


