【问题标题】:Trigger called from Stored Procedure(ROLLBACK for Trigger will happen?)从存储过程调用的触发器(触发器会发生 ROLLBACK 吗?)
【发布时间】:2015-05-28 21:20:22
【问题描述】:

考虑一个场景。我有表T1,它在INSERT 操作上创建了触发器。和存储过程如下。

//StoredProcedure.sql

BEGIN TRANSACTION;
...
...
INSERT INTO TABLE T1
/* Trigger will be executed on record insertion in Table T1 */
.....
.....
.....
.....
Consider some error here...
.....
.....
COMMIT TRANSACTION;
.....
.....
ROLLBACK TRANSACTION;

On Error in Stored Procedure 会调用ROLLBACK TRANSACTION,是否会在Trigger 中执行ROLLBACK 操作?

MSSQL and MySQL:考虑到理想情况,Trigger 将执行ROLLBACK 操作,但我希望您对这个问题发表看法。

【问题讨论】:

  • 在当前事务中对该点所做的所有数据修改都会回滚,包括触发器所做的任何修改。 Rollback transaction

标签: mysql sql-server stored-procedures triggers


【解决方案1】:

是的,它肯定会回滚Trigger执行的操作。

我刚刚测试过。 :)

create table test (id int, testval varchar(20))
create table dummytest (dummyid int, dummytestval varchar(20))

CREATE TRIGGER trg_ins_test
ON test
FOR INSERT
AS
  BEGIN
      INSERT INTO dummytest
                  (dummyid,
                   dummytestval)
      SELECT i.id,
             i.testval
      FROM   inserted i
             LEFT JOIN test t
                    ON i.id = t.id
                       AND i.testval = t.testval
  END 

CREATE PROCEDURE usp_test
AS
  BEGIN
      BEGIN try
          BEGIN TRANSACTION

          INSERT INTO test
          VALUES     (1,
                      'a')

          SELECT 1 / 0

          COMMIT
      END try

      BEGIN catch
          IF @@TRANCOUNT > 0
            ROLLBACK
      END catch
  END 

您可以使用上面的代码进行测试。

【讨论】:

    【解决方案2】:

    你为什么不简单地测试一下? 我用了不到 10 分钟的时间在 sql server 上进行了测试,包括创建表、触发器和存储过程。

    对于sql server,答案是回滚也会回滚触发动作。对于 MySql,我将把测试留给你。

    【讨论】:

    • 目前我无法测试我想要马上得到答案。感谢MSSQL
    • 我在 sql server 上测试用了不到 10 分钟
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2011-09-30
    • 1970-01-01
    • 2018-01-18
    • 2013-09-12
    相关资源
    最近更新 更多