在触发逻辑开始时提交事务

时间:2016-04-27 09:00:45

标签: sql-server tsql triggers

我在表(AFTER INSERT, UPDATE)上有一个触发器,用于根据已添加或更新到表中的内容计算值,并将它们存储在单独的表中。

我已经阅读了很多关于触发器内部错误处理的内容,以及我的触发器逻辑中的错误将ROLLBACK首先调用触发器的原始事务。

为了不惜一切代价保留原始事务(假设在某些时候,触发器可能会失败)我通过做这样的事情来开始我的代码;

-- Grab newly inserted data
SELECT          *
INTO            #Temp
FROM            INSERTED

-- Force transaction to finish, making sure following statements don't roll it back
COMMIT          TRAN

-- Continue using data stored in #Temp
UPDATE          .....
SET             .....
FROM            #Temp

这很有效,即使我在触发逻辑中加入了故意错误,这个问题是否安全?

1 个答案:

答案 0 :(得分:0)

我不知道它是否安全。但作为替代方案,根据您的具体操作,您可以进行插入或更新,然后使用OUTPUT接收插入的数据,并使用这些数据来执行触发逻辑。像这样你不需要触发器,但实际上取决于你的环境(它可能比触发器方法慢一点):

-- update row status (in progress)

update Staging.GFTIntradayLivePricesStaging
set Status = 1 -- in progress
output INSERTED.GFTIntradayLivePricesStagingID into @RowsTransfered
where GFTIntradayLivePricesStaging.Status = 0 -- not processed
and exists
            (
                select top 1 1
                from Portfolio.Objects.Objects
                where GFTInstrumentID = GFTIntradayLivePricesStaging.GFTInstrumentID
            )

关于输出: https://msdn.microsoft.com/en-us/library/ms177564.aspx