テキスト・ファイルからインポートしたデータのレプリケート
概要:ファイルからテーブルにデータを直接インポートし、SQL Remote を使用してそのデータを他のデータベースにレプリケートする場合は、レプリケーションのエラーを回避するために考慮すべき点が多数あります。
1. LOAD ではなく INPUT を使用する
SQL Remote は、トランザクション・ログを読み込んで、必要な SQL Remote メッセージを生成します。つまり、トランザクション・ログでは、テキスト・ファイルのローごとに INSERT 文を記録する必要があります。
LOAD 文を使用すると、変換されたトランザクション・ログは次のようになります。
BEGIN TRANSACTION
go
–SQL-1001-0000197652
load into table a from ‘D:\\test\\1.dat’
go
–COMMIT-1001-0000197702
COMMIT WORK
Go
LOAD 文はレプリケートしません。
2. 連鎖モードをオフにする
過去の SQL Remote の問題がある、SQL Remote の設計上の問題がある、不一致解決メカニズムがない、といういずれかの原因により、SQL Remote を使用して変更を受信しようとするデータベースでデータの一貫性に問題がある場合は、INPUT を使用するだけでは不十分です。レプリケート時に参照整合性の問題が 1 つでも存在すると、SQL Remote のレプリケーション時にレコードのセット全体がロールバックされます。
統合データベースで INPUT 文を使用して、テキスト・ファイルから DBA.b という名前の 1 カラムのテーブルにレコードを挿入するシナリオを考えます。ここで、テキスト・ファイルの内容は次のようになっているものとします。
変換されたトランザクション・ログは、次のようになります。
–BEGIN TRANSACTION-1001-0000197703
BEGIN TRANSACTION
go
–INSERT-1001-0000197736
INSERT INTO DBA.b(a)
VALUES (1)
go
–INSERT-1001-0000197742
INSERT INTO DBA.b(a)
VALUES (2)
go
–INSERT-1001-0000197748
INSERT INTO DBA.b(a)
VALUES (3)
go
–INSERT-1001-0000197754
INSERT INTO DBA.b(a)
VALUES (4)
go
–INSERT-1001-0000197760
INSERT INTO DBA.b(a)
VALUES (5)
go
–COMMIT-1001-0000197766
COMMIT WORK
go
COMMIT は、5 つの INSERT 文の後に 1 回だけ使用されています。統合データベースでデータを読み込み、SQL Remote を実行すると、リモート・データベースに参照整合性があるために最後のロー (5) を挿入できない場合は、それ以外の 4 つのローはすべてロールバックされます。
これを回避するには、テキスト・ファイルからローを入力する前に、連鎖モードをオフに設定します (デフォルトではオンになっています)。オフに設定するには、INPUT 文の直前の “SET TEMPORARY OPTION Chained=’Off’ という行を解釈するように ISQL に指定します。
その結果、変換されたトランザクション・ログは、次のようになります。
–BEGIN TRANSACTION-1001-0000197972
BEGIN TRANSACTION
go
–INSERT-1001-0000198005
INSERT INTO DBA.b(a)
VALUES (1)
go
–COMMIT-1001-0000198011
COMMIT WORK
go
–BEGIN TRANSACTION-1001-0000198012
BEGIN TRANSACTION
go
–INSERT-1001-0000198013
INSERT INTO DBA.b(a)
VALUES (2)
go
–COMMIT-1001-0000198019
COMMIT WORK
go
–BEGIN TRANSACTION-1001-0000198020
BEGIN TRANSACTION
go
–INSERT-1001-0000198021
INSERT INTO DBA.b(a)
VALUES (3)
go
–COMMIT-1001-0000198027
COMMIT WORK
go
–BEGIN TRANSACTION-1001-0000198028
BEGIN TRANSACTION
go
–INSERT-1001-0000198029
INSERT INTO DBA.b(a) VALUES (4)
go
–COMMIT-1001-0000198035
COMMIT WORK
go
–BEGIN TRANSACTION-1001-0000198036
BEGIN TRANSACTION
go
–INSERT-1001-0000198037
INSERT INTO DBA.b(a)
VALUES (5)
go
–COMMIT-1001-0000198043
COMMIT WORK
INPUT 文の実行が終了したら、連鎖モードをオンに戻すか、連鎖モードを設定したクライアント接続を終了します。
テキスト・ファイルからインポートした各ローの INSERT を個別の INSERT 文として解釈し、すべてのレコードの INSERT の後に COMMIT を発行すると、最後のレコードが SQL Remote を使用してリモート・データベースでメッセージを挿入できない場合でも、残りの 4 つのレコードは受信されて適用されます。