2015-03-25 92 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 

您可以使用上面的代碼在您的最後測試。