SQL2k5 を使用して、他の多数のテーブルにデータを入力する列を含むステージング テーブルを作成しました。たとえば、次のようなステートメントです。
INSERT INTO [appTable1] ([colA], [colB])
SELECT [appTable1_colA], [appTable1_colB]
FROM [stageTable]
[appTable1] のトリガーは、新しく挿入された行の ID 列の値を [stageTable] に戻します。この例では、それは [stageTable].[appTable1_ID] であり、FK として他のテーブルに挿入されます。より類似したステートメントは次のように続きます。
INSERT INTO [appTable2] ([colA], [colB], [colC], [appTable1_FK])
SELECT [appTable2_colA], [appTable2_colB], [appTable2_colC], [appTable1_ID]
FROM [stageTable]
このプロセスは、このような多数のテーブルを介して続行されます。ご覧のとおり、ステージング テーブルからの SELECT には WHERE 句を含めていません。このテーブルはプロセスの最後で切り詰められるからです。ただし、これにより、このトランザクションの途中で別のプロセスがこのステージング テーブルにレコードを追加する可能性が残り、それらのレコードには以前に入力された FK が含まれなくなります。これを防ぐために、このステートメントを発行しますか?:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
これが最善の解決策である場合、この方法の欠点は何ですか?