2015-03-25 61 views
-1

考虑一个情景。我已经在INSERT操作上创建了具有触发器的表T1。和存储过程如下。从存储过程调用触发器(ROLLBACK触发器会发生?)

//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:考虑到理想情况下,它会ROLLBACK由触发器执行的操作,但我希望您的问题的意见。

+2

回滚当前事务中对该点所做的所有数据修改,包括由触发器进行的所有修改。 [回滚事务](https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=zh-CN&k=k(ROLLBACK_TSQL); k(SQL11.SWB.TSQLRESULTS.F1); k(SQL11.SWB .TSQLQUERY.F1); k(MISCELLANEOUSFILESPROJECT); k(DevLang-TSQL)&rd = true) – 2015-03-25 09:39:41

回答

1

你为什么不简单地测试? 我花了不到10分钟时间在SQL Server上进行测试,包括创建表,触发器和存储过程。

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

+0

目前我无法测试我想要的答案马上。感谢'MSSQL' – 2015-03-25 09:38:20

+0

**花了我不到10分钟在SQL服务器上测试** – 2015-03-25 09:44:14

1

是的,它肯定会回滚由触发器执行的操作。

我刚测试过它。 :)

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 

您可以使用上面的代码在您的最后测试。