3

名前が異なり、列名が異なる2つのテーブル間でレプリケーションを作成する必要があります。そのような複製を作成することは可能ですか?

server A                                            server B
----------                                          ----------
Table : Test                                        Table : SUBS
--------------                                      ---------------
columns A,B,C                                       Columns D,E,F,G,H

列Aのデータが列Dに複製され、列Bのデータが列Eに複製され、列Cのデータが列Fに複製されるように複製を構成したい

4

1 に答える 1

5

どうやら、答えは次のとおりです。「記事を定義するときは、@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;

テーブル全体をプッシュして、宛先サーバーでマージ操作を実行する方がよい場合があります。

一貫性のあるポイントインタイムスナップショットを作成する場合は、最初のクエリに入力したロックのヒントが重要です。それを気にしない場合は、ロックのヒントを取り出してください。

リンクサーバー全体の更新が遅い場合は、テーブル全体を1つの部分でリモートサーバーの一時ステージングテーブルにプッシュし、スクリプトで完全にリモートサーバーでMERGEを実行します。

于 2011-05-22T04:40:49.087 に答える