2

Id、Name というフィールドを持つ DatabaseA と TableA があるとします。

別のデータベース DatabaseB には、DatabaseId、Id、Name のフィールドを持つ TableA があります。

次のものを送信するレプリケーション パブリケーションをセットアップすることは可能ですか。

DatabaseA.dbid、DatabaseA.TableA.Id、DatabaseA.TableA.Name

DatabaseB.TableA に?

編集:私が尋ねている理由は、(同一のスキーマを持つ) 複数のデータベースを 1 つのデータベースに結合する必要があるためです。レプリケーションは開始するのに適した場所のように思えましたが (ある場所から別の場所にデータをレプリケートする必要があります)、私はまだブレインストーミングの段階にいます。レプリケーションを使用せずにこれを達成する方法について、私は間違いなく提案を受け入れます。

4

2 に答える 2

2

これらのイベントを複数のソースから 1 か所に集約していますか? レプリケートは 1 つのソースからのみ行われます。これは 1 対 1 であるため、ソース ID はあまり意味がないように思われます。

複数のソースからデータを集約する場合は、リンクされたサーバーとトリガーの方が適している可能性があります。その場合は、必要なソースに関する情報を絶対に含めることができます。

質問を明確にして目的を説明していただけると、最善の解決策を見つけるのに役立ちます。

問題の新しい詳細から更新:

このソリューションは、あなたが必要としているもののように思えますか?

  1. 何らかの保持テーブルで、変更された行を中央リポジトリ データベースに送信するソース データベースに AFTER トリガーを設定します。これらの行には、「ソース」、「変更タイプ」(挿入、削除など) などの追加の列を含めることができます。
  2. 一部の中央プロセスがテーブルを監視し、新しい行を処理 (または定期的に実行 - 1 分に 1 回など) し、それらを中央データベースに組み込みます。

必要に応じて、チェック/マージ プロセスがサーバー上で実行される頻度を調整できます (新しい行が表示されるたびに処理するために常に実行することもできます。おそらく、そのテーブルで AFTER トリガーを使用することもできます)。

于 2009-01-07T19:39:21.730 に答える
2

もっと簡単な方法があるかもしれませんが、私が最初に思いついたのは、TableA をソース データベースのインデックス付きビューでラップし、そのビューをテーブルとしてレプリケートすることです (つまり、type = "indexed view logbased")。ただし、これはマージ レプリケーションでは機能しないと思います。

したがって、それは大まかに次のようになります。

CREATE VIEW TableA_with_dbid WITH SCHEMABINDING AS
SELECT DatabaseA.dbid, Id, Name FROM TableA

CREATE UNIQUE CLUSTERED INDEX ON TableA_with_dbid (Id) -- or whatever your PK is

EXEC sp_addarticle ...,
    @source_object = 'TableA_with_dbid',
    @destination_table = 'TableA',
    @type = 'indexed view logbased',
    ...

大きな注意点: インデックス付きビューには、アプリケーションに適さない可能性がある多くの要件があります。たとえば、ベース テーブルを更新するたびに特定のオプションを設定する必要があります。

(あなたの質問の編集に応じて...)これは、複数のソースを1つのテーブルに結合する場合には機能しません。私の知る限り、購読データベース内のオブジェクトは、公開された 1 つの記事からのみ取得できます。また、インデックス付きビューでは UNION が許可されていないため、サブスクライブ側でインデックス付きビューを実行することはできません。(ドキュメントでは UNION ALL が許可されていないと明示的には述べていませんが、私を驚かせることはありません。念のため試してみてください。)しかし、明示的な質問にはまだ答えています。dbid はレプリケートされたテーブルにあります。

于 2009-01-07T19:51:23.793 に答える