MSSQL 2005 Trigger Behavior

2

Eu estou querendo saber como um gatilho em uma tabela se comporta no SQL Server em resposta a uma transação não comprometida afetando essa tabela se o gatilho for especificado para disparar APÓS A ATUALIZAÇÃO.

Se a transação não foi confirmada no UPDATE para a tabela, o gatilho irá disparar? Ou espera (como espero) pela confirmação da transação antes de disparar?

    
por Aushin 01.03.2011 / 15:57

2 respostas

1

O acionador será executado imediatamente após o UPDATE e será considerado parte da transação ativa.

Considere uma situação em que o acionador atualiza / limpa alguns dados da tabela - você não seria capaz de fazer referência a esses dados corrigidos até depois de tentar confirmar a transação se o acionador não disparasse imediatamente.

    
por 01.03.2011 / 16:13
1

É um pouco como você espera. Se a transação não for confirmada, um acionador AFTER UPDATE não será acionado, mas será válido somente para a transação inteira se você verificar o valor de @@Error após suas declarações e reverter a transação.

Considere isso:

CREATE TABLE Table1 (SomeNumber int NOT NULL)
CREATE TABLE Table2 (SomeNumber int)

CREATE TRIGGER UpdAfterTrigger
   ON  Table1
   AFTER UPDATE
AS 
BEGIN
   INSERT Table2 SELECT 1
END

INSERT Table1 (SomeNumber) SELECT 1

BEGIN TRANSACTION

UPDATE Table1 SET SomeNumber=1
UPDATE Table1 SET SomeNumber=1
UPDATE Table1 SET SomeNumber=1
UPDATE Table1 SET SomeNumber=1
UPDATE Table1 SET SomeNumber=NULL

IF (@@error <> 0)
BEGIN
  ROLLBACK TRANSACTION 
END
ELSE
BEGIN
    COMMIT TRANSACTION
END

O acionador não disparará nesse caso, pois a transação está sendo revertida devido ao erro ao inserir NULL em uma coluna NOT NULL .

Se você não verificar @@Error <> 0 e apenas confirmar cegamente a transação, o acionador neste exemplo será disparado para cada uma das quatro boas declarações UPDATE no lote.

    
por 01.03.2011 / 16:08

Tags