ターゲットのIDENTITY列、トリガーおよび制約に対するReplicatの考慮事項
IDENTITY列、トリガー、カスケード制約およびチェック制約があるターゲットSQL Serverデータベースにデータをレプリケートする場合は、次の点を考慮してください。
-
列にIDENTITY列が含まれる場合、Replicatにより表の
IDENTITY_INSERT ON
が設定されます。これにより、配信パフォーマンスが低下する可能性があります。 -
トリガーまたはカスケード制約が含まれる表について、トリガーによって挿入されるデータやカスケード制約によって更新または削除されるデータと同じデータを配信するようにReplicatが構成されている場合は、トリガーまたはカスケード操作を実行するとReplicatエラーが発生する可能性があります。
たとえば、ソースの
TableA
には、レコードをTableB
に挿入するトリガーが含まれます。Extractは、TableA
とTableB
の両方のレコードを取得するように構成されています。ターゲットでは、Replicatにより、最初にTableA
のレコードが挿入され、次に、TableA
のトリガーが起動してTableB
に挿入された後、Replicatによって同じレコードのTableB
への挿入が試行される結果、Replicatエラーが発生します。 -
すべての外部キーのチェック制約も強制されるため、配信パフォーマンスが低下する可能性があります。
-
トリガーがあるターゲット・データベース上の表には、
SET XACT_ABORT
パラメータをオフに設定します。これにより、トリガー操作の実行によるトランザクションの欠落がなくなります。
このような状況に対処するために、レプリケーションのユースケースに基づいて実装できるいくつかのオプションがあります。
-
Replicatがターゲット表にデータを書き込む唯一のプロセスである一方向の実装では、ターゲット表のIDENTITY列、トリガーおよび制約について次のオプションを検討します。
-
ターゲット表のIDENTITYプロパティ、トリガーおよび制約を無効化または削除します。
-
IDENTITYプロパティ、トリガーおよび制約を変更し、それぞれに対して
NOT FOR REPLICATION
オプションをオンに設定して、Microsoft ODBCドライバが少なくともバージョン17.8.1であることを確認します。
-
-
Replicatとアプリケーションの両方でターゲット表にデータが書き込まれ、トリガーと制約が有効になっている複数方向の実装では、IDENTITYプロパティ、トリガーおよび制約を変更し、それぞれに対して
NOT FOR REPLICATION
オプションをオンに設定して、Microsoft ODBCドライバが少なくともバージョン17.8.1であることを確認します。また、複数方向レプリケーション構成で
IDENTITY
列を使用するには、それぞれに異なるシード値を持ち、構成内のサーバーの数と等しい増分値を持つようにIDENTITY
列を定義します。たとえば、3つのデータベース構成は次のようになります。
Database1は、増分値3で、0にシード値を設定します。
Database2は、増分値3で、1にシード値を設定します。
Database3は、増分値3で、2にシード値を設定します。