从存储过程调用触发器(触发器的ROLLBACK会发生吗?)

时间:2015-03-25 09:20:54

标签: mysql sql-server stored-procedures triggers

考虑一个场景。我在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;

存储过程中的错误将调用ROLLBACK TRANSACTION,是否会在触发器中执行ROLLBACK操作?

MSSQL and MySQL:考虑到理想情况,它由Trigger执行ROLLBACK操作,但我希望您对该问题有所了解。

2 个答案:

答案 0 :(得分:1)

为什么不简单地测试? 我花了不到10分钟在sql server上测试,包括创建表,触发器和存储过程。

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

答案 1 :(得分: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 

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