【问题标题】:Committing Transaction at the Beginning of Trigger Logic在触发逻辑开始时提交事务
【发布时间】:2016-08-21 11:17:45
【问题描述】:

我在表 (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

这有效,即使我在触发逻辑中故意放置错误,问题是这样安全吗?

【问题讨论】:

    标签: sql-server tsql triggers


    【解决方案1】:

    我不知道它是否安全。但作为替代方案,根据您的具体操作,您可以进行插入或更新,然后使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      相关资源
      最近更新 更多