我想知道,如果指定触发器在更新后触发,则在 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 条良好语句中的每一个触发。