ターゲットのIDENTITY列、トリガーおよび制約に対するReplicatの考慮事項

IDENTITY列、トリガー、カスケード制約およびチェック制約があるターゲットSQL Serverデータベースにデータをレプリケートする場合は、次の点を考慮してください。

  • 列にIDENTITY列が含まれる場合、Replicatにより表のIDENTITY_INSERT ONが設定されます。これにより、配信パフォーマンスが低下する可能性があります。

  • トリガーまたはカスケード制約が含まれる表について、トリガーによって挿入されるデータやカスケード制約によって更新または削除されるデータと同じデータを配信するようにReplicatが構成されている場合は、トリガーまたはカスケード操作を実行するとReplicatエラーが発生する可能性があります。

    たとえば、ソースのTableAには、レコードをTableBに挿入するトリガーが含まれます。Extractは、TableATableBの両方のレコードを取得するように構成されています。ターゲットでは、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にシード値を設定します。