Sql Server - Trigger - Saber se está inserindo alterando ou deletando...
ola
boa noite...
ja procurei mas nao achei...
ate achei, mas nao sei se é o correto...
estou migrando uma trigger do firebird para o sql server...
no firebird, a trigger é para insert, update e delete... a mesma trigger...
dentro da trigger eu verifico: se esta inserindo, executo os comandos necessários para a logica do negócio referente ao insert, se esta alterando, executo os comandos necessários para a logica do negócio referente ao update, e para o delete, a mesma coisa...
faço assim, no firebird...
como faço algo semelhante no sql server, sem ter que criar uma trigger para cada evento (insert, update, delete) ?!
boa noite...
ja procurei mas nao achei...
ate achei, mas nao sei se é o correto...
estou migrando uma trigger do firebird para o sql server...
no firebird, a trigger é para insert, update e delete... a mesma trigger...
dentro da trigger eu verifico: se esta inserindo, executo os comandos necessários para a logica do negócio referente ao insert, se esta alterando, executo os comandos necessários para a logica do negócio referente ao update, e para o delete, a mesma coisa...
faço assim, no firebird...
IF (INSERTING) THEN ... ... ... END IF (UPDATING) THEN ... ... ... END IF (DELETING) THEN ... ... ... END
como faço algo semelhante no sql server, sem ter que criar uma trigger para cada evento (insert, update, delete) ?!
Felipe Barros
Curtidas 0
Respostas
Claudio Lopes
22/02/2016
De uma olhada no link [url:descricao=Triggers no SQL Server: teoria e prática aplicada em uma situação real]https://www.devmedia.com.br/triggers-no-sql-server-teoria-e-pratica-aplicada-em-uma-situacao-real/28194[/url]
Mas adiantando sua resposta:
Vc determina um evento a uma ação. Não sei se na mesma trigger vc consegue abordar as três situações, mas acho que terá que criar três triggers
Trecho no link->>>>
FOR/AFTER/INSTEAD OF: uma dessas opções deve ser escolhida para definir o momento em que o trigger será disparado. FOR é o valor padrão e faz com o que o gatilho seja disparado junto da ação. AFTER faz com que o disparo se dê somente após a ação que o gerou ser concluída. INSTEAD OF faz com que o trigger seja executado no lugar da ação que o gerou.
INSERT/UPDATE/DELETE: uma ou várias dessas opções (separadas por vírgula) devem ser indicadas para informar ao banco qual é a ação que disparará o gatilho. Por exemplo, se o trigger deve ser disparado após toda inserção, deve-se utilizar AFTER INSERT.
Mas adiantando sua resposta:
Vc determina um evento a uma ação. Não sei se na mesma trigger vc consegue abordar as três situações, mas acho que terá que criar três triggers
Trecho no link->>>>
FOR/AFTER/INSTEAD OF: uma dessas opções deve ser escolhida para definir o momento em que o trigger será disparado. FOR é o valor padrão e faz com o que o gatilho seja disparado junto da ação. AFTER faz com que o disparo se dê somente após a ação que o gerou ser concluída. INSTEAD OF faz com que o trigger seja executado no lugar da ação que o gerou.
INSERT/UPDATE/DELETE: uma ou várias dessas opções (separadas por vírgula) devem ser indicadas para informar ao banco qual é a ação que disparará o gatilho. Por exemplo, se o trigger deve ser disparado após toda inserção, deve-se utilizar AFTER INSERT.
GOSTEI 0
William
22/02/2016
A maneira como o SQL Server detecta o tipo de operação que está sendo executada é meio estranha porém segue uma lógica, como ele cria tabelas temporárias durantes as operações basta você verificar o estado dessas tabelas, nas minhas triggers trabalho assim:
IF EXISTS(SELECT id FROM deleted) BEGIN IF EXISTS(SELECT id FROM inserted) BEGIN /* Rotina de UPDATE */ END ELSE BEGIN /* Rotina de DELETE */ END END ELSE BEGIN IF EXISTS(SELECT id FROM inserted) BEGIN /* Rotina de INSERT */ END END
GOSTEI 0
Felipe Barros
22/02/2016
realmente nao tem como fazer...
GOSTEI 0
David Sylvestre
22/02/2016
realmente nao tem como fazer...
Basta seguir a lógica do Willian.
IF EXISTS(SELECT 'TRUE' FROM inserted ins LEFT JOIN deleted del ON del.pk = ins.pk WHERE del.pk IS NULL) BEGIN print 'INSERT' END IF EXISTS(SELECT 'TRUE' FROM inserted ins INNER JOIN deleted del ON del.pk = ins.pk) BEGIN print 'UPDATE' END IF EXISTS(SELECT 'TRUE' FROM deleted del LEFT JOIN inserted ins ON ins.pk = del.pk WHERE ins.pk IS NULL) BEGIN print 'DELETE' END
Sei que parece complicado por conta dos outros bancos utilizarem new.coluna e old.coluna.
O sqlserver cria essas duas tabelas deleted e inserted no lugar desse modo.
GOSTEI 0