Array
(
)

Sql Server - Trigger - Saber se está inserindo alterando ou deletando...

Felipe Barros
   - 22 fev 2016

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...
#Código

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) ?!

Din
|
MVP
Pontos: 45
    23 fev 2016

De uma olhada no link Triggers no SQL Server: teoria e prática aplicada em uma situação real

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.

William (devwilliam)
   - 23 fev 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:

#Código

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

Felipe Barros
   - 23 fev 2016

realmente nao tem como fazer...

David Sylvestre
   - 23 fev 2016


Citação:
realmente nao tem como fazer...

Basta seguir a lógica do Willian.

#Código

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.