我在表(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
这很有效,即使我在触发逻辑中加入了故意错误,这个问题是否安全?
答案 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