テキスト・ファイルからインポートしたデータのレプリケート
ファイルから直接インポートしたデータをテーブルに設定するときに、そのデータがSQL Remote によって他のデータベースへレプリケートされることになっている場合は、レプリケーション・エラーを回避するためにいくつかの問題を検討する必要があります。
1. L O A D ではなくI N P U T を使用する
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
2
3
4
5
変換後のトランザクション・ログは次のようになります。
–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 文の最後にだけ現れることに注意してください。統合データベース内のデータをロードして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 文として解釈され、レコードの挿入ごとにCOMMITが発行されるため、SQL Remote メッセージによる最終レコードの挿入がリモート・データベースで失敗した場合であっても、残りの4 つのレコードは引き続き受信されて適用されます。