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