【问题标题】:Different triggers same job?不同的触发相同的工作?
【发布时间】:2015-05-29 07:53:53
【问题描述】:

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

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 

第二个问题,如果你有INSTEAD OF,为什么还要使用ROLLBACK

【问题讨论】:

  • 当然,真正的问题应该是,如果您只是要使用触发器来防止更新工作吗?
  • 例如,您想在更新时设置一些与您正在更新的值相关的条件。
  • 如果是 条件 错误/回滚,则触发器不一样,因为如果条件为假,INSTEAD OF 触发器需要执行实际更改。但是,如果这是您要讨论的那种情况,那么您在问题中显示的触发因素并不具有代表性,那么我们如何知道这一点?
  • 那是我的错误。但我的目标是知道您是否可以在每种情况下都摆脱 ROLLBACK。

标签: sql triggers ddl


【解决方案1】:

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

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

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

【讨论】:

  • 好的,明白了。但是为什么在某些情况下你会使用回滚呢?
  • 在第一种情况下,会发生更新,因此需要回滚以确保以后不会提交更新。在第二种情况下,没有发生更新,因此不需要回滚。 (您也可以在此处添加回滚语句,但这将是多余的。)
  • 好的,谢谢。你有需要回滚的例子吗?
  • 您的第一个场景是我现在可以呈现给您的最佳案例。假设您为某些记录更新了test 中的特定列。假设触发器没有回滚语句。并且在更新test 之后,您需要立即更新另一个表test2,您在其中更新了一些记录并且该表的更新没有触发器。在test2 上更新后,您提交您的更改。然后对表test 的更改也将与test2 的更改一起提交。因此,回滚对于在引发错误后正确防止更新是必要的。
  • 如果触发回滚,我不知道测试 2 是否会回滚,因为触发器绑定到 table1,所以我认为它只在父表上执行。
猜你喜欢
  • 2020-12-04
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多