どうやら、答えは次のとおりです。「記事を定義するときは、@vertical_partition
を設定する必要があります。 パラメーターを true に設定し、必要な列を sp_articlecolumn
で追加します ."
しかし、私はあなたがなぜこれをしているのかを尋ねなければなりません。私の考えでは、レプリケーションは異なるデータベース間でデータを移動するための一般的なツールではなく、2 つの同一のデータベースの同期を維持するためのものです。
その他のブレインストーミング アイデア:
- 宛先テーブルと一致する新しいソース テーブルを作成し、トリガーを使用してソース テーブルの同期を維持することができます。
- ソース テーブルをそのまま宛先にプッシュし、宛先データベースで MERGE を実行します。
- ここでは、レプリケーションは実際には適切なソリューションではない可能性があります。これを行うために求められているビジネスルールと要件は何ですか? SSIS の使用を検討しましたか?
- 2 つのテーブルを常に正確に同期させる必要がある場合、ソース テーブルへの変更の経路は何ですか?つまり、アプリケーションはどれですか?あなたのアプリケーションには、新しいレベルの抽象化、つまり 2 つのソースに同時に書き込む方法を知っているデータ書き込みレイヤーが必要なようです。
2 つの異なるデータベース間でデータの同期を維持しようとすると、問題が発生する場合があります。競合状態、分散トランザクションの欠如 (一貫性と障害への対応に影響)、分散トランザクションがない場合に対処するために作成された回避策の問題など、あらゆる種類の微妙な問題が発生する可能性があります。代わりに、一方のデータベースのデータを他方のデータベースからリアルタイムでアクセスできるリンク サーバーといくつかのビューを作成できますか?
要件と、これを行う必要がある理由について詳しく教えてください。
更新
手動更新ルートを使用する場合は、期間の挿入、更新、および削除操作をまとめて適用できないことに注意してください。 順番に、一度に 1 つずつ適用する必要があります . 現在の状態で作業している場合 中間データ操作ではなく、一度にすべての行を実行できます。履歴再生の例ではなく、MERGE の例を示します。
BEGIN TRAN; DELETE D FROM LinkedServer.dbo.Dest D WITH (TABLOCKX, HOLDLOCK) WHERE NOT EXISTS ( SELECT * FROM Source S WHERE D.Key = S.Key ); UPDATE D SET D.Col1 = S.Col4, D.Col2 = S.Col5, D.Col3 = S.Col6, D.Col4 = S.Col7, FROM LinkedServer.dbo.Dest D INNER JOIN Source S ON D.Key = S.Key WHERE D.Col1 <> S.Col4 OR EXISTS ( SELECT D.Col2, D.Col4 EXCEPT SELECT S.Col3, S.Col6 ); -- or some other way to handle comparison of nullable columns INSERT LinkedServer.dbo.Dest (Col1, Col2, Col3) SELECT Col4, Col5, Col6 FROM Source S WITH (TABLOCK, HOLDLOCK) WHERE NOT EXISTS ( SELECT * FROM LinkedServer.dbo.Dest D WHERE S.Key = D.Key ); COMMIT TRAN;
プレ>テーブル全体をプッシュし、宛先サーバーでマージ操作を行う方がよい場合があります。
最初のクエリに入力したロック ヒントは、一貫したポイント イン タイム スナップショットを取得する場合に重要です。それを気にしない場合は、ロックのヒントを取り出してください。
リンク サーバー全体の更新が遅いことがわかった場合は、テーブル全体をまとめてリモート サーバー上の一時ステージング テーブルにプッシュし、リモート サーバー上のスクリプト全体で MERGE を実行します。