sql >> データベース >  >> RDS >> Sqlserver

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

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




    1. OracleODBC接続でのパラメータの使用

    2. Postgres:エラー:文字が変化するタイプには値が長すぎます(255)フィールドを指定していません

    3. SQLiteクエリ結果に列名を含める

    4. OracleAPEXデータベーストリガー-データベース列の参照に関する問題