Sql 同一份工作的不同触发因素?

Sql 同一份工作的不同触发因素?,sql,triggers,ddl,Sql,Triggers,Ddl,我有两个触发器,我想知道执行的工作的结果是否相同 CREATE TRIGGER trg_test_upd ON test AFTER UPDATE AS RAISERROR('Error', 16, 1); ROLLBACK; GO CREATE TRIGGER trg_test_upd ON test INSTEAD OF UPDATE AS RAISERROR('Error', 16, 1); GO 第二个问题,如果有而不是,为什么要使用回滚?这两个触发器的工

我有两个触发器,我想知道执行的工作的结果是否相同

CREATE TRIGGER trg_test_upd ON test AFTER UPDATE
AS
  RAISERROR('Error', 16, 1);
  ROLLBACK;
GO 

CREATE TRIGGER trg_test_upd ON test INSTEAD OF UPDATE
AS
  RAISERROR('Error', 16, 1);      
GO 

第二个问题,如果有
而不是
,为什么要使用
回滚

这两个触发器的工作方式相同,只是第一个触发器可能需要更多时间

假设您的
test
表有一个包含一百万条记录的表。您尝试为每个记录更新一些列。然后首先执行更新操作,并且只有在所有记录的更新完成后,才会激活触发器。然后,触发器将引发错误,并使用
ROLLBACK
命令通过update语句放弃所有更改


在第二种情况下,一旦遇到表上的更新,就会激活触发器。这将节省大量不必要的数据处理。要回答第二个问题,在第二种情况下,当使用
而不是
时,不会执行更新操作。因此,不需要使用
回滚
命令。

当然,真正的问题应该是,为什么您首先要授予任何人对该表的
更新
权限,如果您正打算使用触发器阻止更新工作?例如,您想对更新设置一些与正在更新的值相关的条件。如果是条件错误/回滚,则触发器不同,因为如果条件为false,则
而不是
触发器需要执行实际更改。但是,如果你想讨论这类案例,那么你在问题中展示的触发因素并不具有代表性,那么我们怎么知道这一点呢?这是我的错误。但我的目标是知道你是否能在任何情况下摆脱回滚。好的,明白了。但在某些情况下为什么要使用回滚呢?在第一种情况下,会发生更新,因此回滚是必要的,以确保更新不会在以后提交。在第二种情况下,没有发生更新,因此不需要回滚。(您也可以在那里添加回滚语句,但这是多余的。)很好,谢谢。您有需要回滚的示例吗?您的第一个场景是我现在可以向您介绍的最好的案例。假设您为某些记录更新了
test
中的特定列。假设触发器没有rollback语句。在更新
test
之后,您需要立即更新另一个表
test2
,其中您更新了一些记录,并且该表的更新没有触发。在
test2
上更新后,提交更改。然后,对表
test
的更改也将与对
test2
的更改一起提交。因此,回滚对于在引发错误后正确阻止更新是必要的。如果启动了回滚,我不知道测试2是否会回滚,因为触发器绑定到表1,所以我假设它只在父表TABLE上执行。