Sql Server - Trigger - Saber se está inserindo alterando ou deletando...
22/02/2016
0
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
Posts
23/02/2016
Claudio Lopes
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.
23/02/2016
William
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
23/02/2016
David Sylvestre
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.
Clique aqui para fazer login e interagir na Comunidade :)