2013-07-30 50 views
4

我正在使用Sql Server 2008。我有一個Trigger它更新我的兩個其他表。我已經閱讀了Stack over flow這個鏈接enter link description here,但它並沒有完全滿足我的需求。下面是我Trigger交易已結束觸發器批次已中止

ALTER TRIGGER [Inventory].[StockUpdationOnIssue] 
ON    [Inventory].[StockIssueDetails] 
AFTER   INSERT 
AS 
BEGIN 
    BEGIN TRY 
     BEGIN TRAN 
        INSERT INTO TableA 
         (col1, col2,col3 
         ) 
        SELECT  I.col1,I.col2,si.col3 
        FROM  inserted I 
        INNER JOIN Inventory.StockIssue SI 
        ON   SI.StockIssueId = I.StockIssueId 

        INSERT INTO TableB 
         (col1, col2,col3 
         ) 
        SELECT  I.col1,I.col2,si.col3 
        FROM  inserted I 
        INNER JOIN Inventory.StockIssue SI 
        ON   SI.StockIssueId = I.StockIssueId 

     COMMIT TRAN 
    END TRY 
    BEGIN CATCH 
     SELECT ERROR_MESSAGE(); 
     RollBack Tran; 
    END CATCH 
END 

以下錯誤顯示給我...

enter image description here

+2

我想你忘了*提問* –

+0

@lc。檢查更新的問題。 –

+0

這仍然不是問題。你有什麼問題?你不知道該怎麼做? –

回答

7

您可以保存錯誤的詳細信息在錯誤日誌表,這樣你就可以回來以後進行調查。
喜歡的東西

ALTER TRIGGER [Inventory].[StockUpdationOnIssue] 
ON    [Inventory].[StockIssueDetails] 
AFTER   INSERT 
AS 
BEGIN 
    BEGIN TRY 
     BEGIN TRAN 
        INSERT INTO TableA 
         (col1, col2,col3 
         ) 
        SELECT  I.col1,I.col2,si.col3 
        FROM  inserted I 
        INNER JOIN Inventory.StockIssue SI 
        ON   SI.StockIssueId = I.StockIssueId 

        INSERT INTO TableB 
         (col1, col2,col3 
         ) 
        SELECT  I.col1,I.col2,si.col3 
        FROM  inserted I 
        INNER JOIN Inventory.StockIssue SI 
        ON   SI.StockIssueId = I.StockIssueId 

     COMMIT TRAN 
    END TRY 
    BEGIN CATCH 
     DECLARE @ErrorMsg VARCHAR(MAX), @ErrorNumber INT, @ErrorProc sysname, @ErrorLine INT 

     SELECT @ErrorMsg = ERROR_MESSAGE(), @ErrorNumber = ERROR_NUMBER(), @ErrorProc = ERROR_PROCEDURE(), @ErrorLine = ERROR_LINE(); 
     RollBack Tran; 

     INSERT INTO ErrorLog (ErrorMsg, ErrorNumber, ErrorProc, ErrorLine) 
     VALUES    (@ErrorMsg, @ErrorNumber, @ErrorProc, @ErrorLine) 
    END CATCH 
END 

作爲表錯誤日誌,如:

CREATE TABLE ErrorLog 
(
    ErrorLogID INT IDENTITY(1,1), 
    ErrorDate DATETIME DEFAULT (GETUTCDATE()), 
    ErrorMsg VARCHAR(MAX), 
    ErrorNumber INT, 
    ErrorProc sysname, 
    ErrorLine INT 
) 
+1

對於'CATCH'塊中的'ROLLBACK TRANSACTION'來說非常重要,否則就會出現如下錯誤:「當前事務不能被提交併且不能支持寫入日誌文件的操作。回退事務。」 –

2

我得到了相同的錯誤消息。您不需要觸發器內的事務,因爲它默認有一個事務;即你不需要開始轉換也不需要轉換。但是,您可以在回滾中使用回滾,並在出現異常情況時回滾。

ALTER TRIGGER [Inventory].[StockUpdationOnIssue] 
ON    [Inventory].[StockIssueDetails] 
AFTER   INSERT 
AS 
BEGIN 
    BEGIN TRY 
        INSERT INTO TableA 
         (col1, col2,col3 
         ) 
        SELECT  I.col1,I.col2,si.col3 
        FROM  inserted I 
        INNER JOIN Inventory.StockIssue SI 
        ON   SI.StockIssueId = I.StockIssueId 

        INSERT INTO TableB 
         (col1, col2,col3 
         ) 
        SELECT  I.col1,I.col2,si.col3 
        FROM  inserted I 
        INNER JOIN Inventory.StockIssue SI 
        ON   SI.StockIssueId = I.StockIssueId 
    END TRY 
    BEGIN CATCH 
     RollBack Tran; 
    END CATCH 
END