2013-07-30 42 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