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

22/02/2016

0

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...

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

Felipe Barros

Responder

Posts

23/02/2016

Claudio Lopes

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.
Responder

23/02/2016

William

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
Responder

23/02/2016

Felipe Barros

realmente nao tem como fazer...
Responder

23/02/2016

David Sylvestre

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.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar