Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marcio.theis

Trigger Oracle para SQLServer

Recommended Posts

Tenho uma dúvida sobre como montar um trigger no SQLServer a tabela para suprir o insert, update e delete...

 

Em oracle eu faço o seguinte:

Exemplo:

CREATE OR REPLACE TRIGGER TRG_TESTEAFTER INSERT OR UPDATE OR DELETE ON TESTEFOR EACH ROWBEGINIF INSERTING THEN	INSERT INTO TABELA(CAMPO1,CAMPO2) VALUES (:NEW.CAMPO1,:NEW.CAMPO2);ELSIF UPDATING THEN	   INSERT INTO TABELA(CAMPO1,CAMPO2) VALUES (:NEW.CAMPO1,null);ELSIF DELETING THEN	   INSERT INTO TABELA(CAMPO1,CAMPO2) VALUES (:OLD.CAMPO1,:OLD.CAMPO2);END IF;END;

Ou seja, a mesma trigger controla as três funcionalidades, então minha dúvida é se tem como fazer em apenas uma trigger o mesmo para o SQLServer...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio,

 

Você pode montar a trigger do mesmo modo no Sql Server, contudo a opção "REPLACE" na criação da trigger deve ser substituída por uma verificação na tabela "sysobjects", excluindo a trigger antiga antes da atualização.

 

Quanto o suporte ao insert, update ou delete na mesma trigger, é só utilizar a sintaxe abaixo...

 

IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[dbo].[TRG_TESTE]') AND OBJECTPROPERTY(id, N'IsTrigger') = 1)	 DROP PROCEDURE [dbo].[TRG_TESTE]  GO  	  CREATE TRIGGER TRG_TESTE  ON TESTE  FOR INSERT, UPDATE, DELETE   AS	:	:     GO								-- Finaliza a inclusão da trigger

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço nenhuma função do Sql Server que permita identificar qual operação disparou determinada trigger, por isto recomendo a criação de triggeres separadas.

 

Uma alternativa que pode ser tentada, embora seja necessário analisar o problema com um pouco mais de cuidado, é tratar as tabelas de "inserted" e "deleted" na TENTATIVA de tentar identificar as operações. Toda trigger disparada no sql server cria duas tabelas temporárias que podem ser manipuladas pela própria trigger em tempo de execução.

 

Talvez seja possível analisar estás tabelas temporárias para definir o tipo de operação, utilizando a seguinte lógica :

 

> Inserted = NOT NULL and Deleted = NULL ... Operação = Insert

> Inserted = NOT NULL and Deleted = NOT NULL ... Operação = Update

> Inserted = NULL and Deleted = NULL ... Operação = Delete

 

Sinceramente, acho que não vale a pena !

 

De qualquer jeito, segue um exemplo do funcionamento destas "tabelas especiais" apenas para ilustrar...

 

set nocount onCREATE TABLE tabela (campo1 int,  campo2 char(1))goCREATE TRIGGER gatilhoON tabelaFOR INSERT, UPDATE, DELETEAS    print 'Inserted'    select * from inserted   print 'Deleted'   select * from deletedgoprint '[Insert]'insert tabela (campo1, campo2) values (1,'a')goprint '[Update]'update tabela set campo2 = 'b'goprint '[Delete]'delete tabelagodrop table tabelagoset nocount off

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.