2016-04-27 5 views
1

テーブルに追加または更新された値に基づいて値を計算し、別のテーブルに格納するトリガがテーブル(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

安全かどうかわかりません。しかし、代わりに、正確に何をしているかに応じて、挿入や更新を行い、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

関連する問題