4

SQL Server 2008R2 でのプロセス シナリオがあります。

• データを収集し、2 つの SQL Server 間でデータを転送するための usp

このプロセスは、プロセスのすべてのレベル (usp、SSIS、およびトリガー) のトランザクションで実行されます。

ここに画像の説明を入力

データを DB7.dbo.Dest に転送するデータ フローでは、このテーブルには AFTER INSERT トリガーがあり、通過したばかりのデータを最終テーブル DB7.dbo.FinalDestination に挿入します。

CREATE TRIGGER [dbo].[Insert_OnStaging] ON [dbo].[Dest]
AFTER INSERT, UPDATE
AS
    BEGIN

SET NOCOUNT ON;    
SET XACT_ABORT ON;  --Rollsback complete transaction if there are any errors

BEGIN TRY

BEGIN TRANSACTION

INSERT INTO [DB7].[dbo].[FinalDestination] WITH (TABLOCK)
       (Column1
       ,Column2
       )
SELECT I.Column1, I.Column2 
FROM INSERTED I
INNER JOIN [DB7].[dbo].[Dest] PR
ON I.IDcol = PR.IDcol

COMMIT TRANSACTION

END TRY

BEGIN CATCH
IF @@TRANCOUNT > 0 AND XACT_STATE() <> 0
    ROLLBACK TRANSACTION;

DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
DECLARE @ErrorLine INT;

SELECT 
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE(),
@ErrorLine = ERROR_LINE()
;

RAISERROR (@ErrorMessage, -- Message text.
           @ErrorSeverity, -- Severity.
           @ErrorState, -- State.
           @ErrorLine  --Error Line
           );    
END CATCH;
END

すべてのレベルで、データの機密性が適切であり、完全に最終テーブルに到達しているため、データについて防御しようとしました。

SSISに関しては、私が読んでテストしたところ、うまく機能しているようです。

私の最大の懸念は、上記でスクリプトを作成したトリガーです。私の読書と理解から、XACT_ABORT ON を設定すると、エラーが発生した場合 (つまり、コミットできないトランザクションがある場合)、TRY ブロック内のトランザクションがロールバックされます。この場合、私は先に進み、CATCH ブロックにロールバック トランザクション部分を追加しました。同時に、INSERT の実行中にテーブルをロックするために、WITH (TABLOCK) オプションを追加しました。

トリガーの場合、XACT_ABORT が ON の場合でも TRY...CATCH は必要ですか? TRY ブロック内で COMMIT TRANSACTION は必要ですか? また、 @@TRANCOUNT に基づく CATCH ブロックの後にコミットされたのを見たように

BEGIN TRY
BEGIN TRANSACTION
[Tsql here]
END TRY
BEGIN CATCH
[Error Handling]
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION
END

回答と批評を歓迎します。事前に感謝します。名前を一般化しようとしたため、タイプミスがある場合はご容赦ください...

4

1 に答える 1

3

TRY..CATCHを使用していても必要ですXACT_ABORTXACT_ABORTトランを中止しますが、バッチ/手順の実行を続けます! これは非常に厄介な動作です。これは、エラーが発生した後でも DML/DDL を実行できるが、トランザクションの外部で実行できるため、ロールバックできないことを意味します。

SQL Server には、TRY..CATCH. 何が良いのかわかりませんXACT_ABORT。あなたの例では、それは役に立ちませんし、害もありません。

COMITはい、必要に応じて外側に移動できTRYます。とのバランスを適切にとってBEGIN TRANください。

于 2013-04-23T15:49:14.877 に答える