MSSQL 2005 触发器行为

MSSQL 2005 触发器行为

我想知道,如果指定触发器在更新后触发,则在 SQL Server 中表上的触发器将如何响应影响该表的未提交的事务。

如果在对表执行 UPDATE 时尚未提交事务,触发器是否仍会触发?还是它会等待(我希望它会这样做)事务提交后再触发?

答案1

触发器将在 UPDATE 之后立即运行,并被视为活动事务的一部分。

考虑这样一种情况:触发器更新/清理表中的某些数据 - 如果触发器没有立即触发,则在尝试提交事务之后您将无法引用这些更正后的数据。

答案2

这在某种程度上是您所希望的。如果事务未提交,则触发器不会触发,但只有当您在语句之后检查值并回滚事务AFTER UPDATE时,它才对整个事务成立。@@Error

考虑一下:

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

NULL在这种情况下,触发器将不会触发,因为插入列时出现错误导致事务被回滚NOT NULL

如果您不检查@@Error <> 0而只是盲目地提交事务,那么此示例中的触发器将针对UPDATE批次中的 4 条良好语句中的每一个触发。

相关内容