0

私は、2 つの別々のサイトとしてデプロイされた ASP.NET Web アプリケーションに取り組んでいます。各サイトは、同じ (同じスキーマ) ORACLE データベース (10g) の独自のインスタンスによって支えられていますが、各データベースには「個別の」データが含まれています。一方のサイトには「セキュア データ」のみが含まれ、もう一方のサイトには「オープン データ」のみが含まれます。セキュアなサイトとセキュアなデータを見ることができるのは少数のユーザーだけですが、オープン サイトは企業の大部分が利用できます。

セキュア サイトのユーザーは、セキュア サイトからセキュア データとオープン データの両方を表示できることを望んでいます。さらに、彼らはオープン データを変更できるようにしたいと考えており、セキュア サイトからオープン データへの変更をオープン サイトに伝達し、それに応じて競合を処理する必要があります。

安全なユーザーのために安全でオープンなデータを表示する必要があるストアド プロシージャに関連付けられたレポートがあるため、データベースのみのソリューションを期待しています。

それに応じて、データが安全であるとマークされていると想定できます (Y/N)。

私たちが進んでいる現在の道は、望ましいとは言えません。セキュア データベースを変更して、開いているデータベースへのデータベース リンクを含める必要があります。また、セキュア データベースに追加のビューを追加して、データベース リンクを介してセキュア データとオープン データを「結合」します。同時に、安全なサイトの元のストアド プロシージャをオーバーホールして、CRUD 操作を処理します。

if (someRecord.IsSecure = 'Y')
update secure data;
else
update open data;

先に進む前に、レプリケーションなど、この問題を解決するためのより良い方法があるかどうかを確認したいと思いました.

マルチマスターレプリケーションを見てきました。これは正しい道のように思えますか? この種のシナリオに直面した人はいますか?

4

1 に答える 1

1

私が取り組んでいるプロジェクトでは、Oracle Streamsマルチマスター レプリケーションをサポートするために使用しています (ニューヨーク、ロンドン、シンガポールでグローバルに 3 つのサイトを運営しており、すべて同じデータを読み取り、更新する機能が必要です)。

Streams は、規制要件のために利用する条件付きレプリケーションをサポートしています (たとえば、シンガポールでは、プライベート バンキングのクライアント データは国外に持ち出すことができません)。

Streams を使用すると、たとえば、スキーマ全体 (DML および/または DDL) またはテーブルのリストのみをレプリケートできます。トランザクション内でストリームを制御して、レプリケートされたオブジェクトの個々の行操作がレプリケートされないようにすることができます..例:

if (is_secure)
then
  dbms_streams.set_tag('01'); -- set a non null tag to prevent replication.
end if;

insert into your_table ()..values ();

if (is_secure)
then
  dbms_streams.set_tag(''); -- set a the null tag back 
end if;

insert into your_table ()..values ();

が trueのシナリオでis_secureは、2 番目のルールのみがレプリケートされます (null 以外のストリーム タグが存在する場合、レプリケーション ルールをレプリケートしないように設定できます)。したがって、データが安全な場合は、コードでこのタグを設定するだけです。そうすれば、ストリームはこのトランザクションをリモート サイトに適用しません。

マルチマスターレプリケーションの場合、「衝突」の可能性を事前に考慮する必要があります。つまり、2 つ以上のサイトが同じデータを並行して変更する場合です。これを処理して (複雑なシナリオでは適用ハンドラーを設定できます)、適用エラーを発生させずに競合を解決する必要があります。たとえば、これはレプリケートされたオブジェクトの設計としては不十分です。

create table foo
(
  id number primary key,
  data
);
create sequence foo_seq start with 1 increment by 1;

それが両方のサイトで作成され、誰かがサイト 1 で並行して発行した場合:

insert into foo (id, data) values (foo_seq.nextval, 'a');

およびサイト 2:

insert into foo (id, data) values (foo_seq.nextval, 'b');

どちらのサイトも主キーに「1」を挿入しようとします。これはレプリケーションで失敗し、分類するために適用エラーが発生します。

たとえばstart with 100 increment by 100、ある環境とstart with 101 increment by 100他の環境でこの問題を解消する、または / にlocation_id設定された列を追加するなど、各環境で異なるシーケンスを設定することができます1または2サイトごとに etc.

また、更新では、同時に同じ行を更新する 2 つ以上のサイトを処理する必要があります (サイト間には常に少しの待ち時間があるため、待ち時間が長くなればなるほど、衝突処理が必要なシナリオに移行する際の変化が大きくなります)。

Streams のセットアップと理解は少し複雑なので、このテーマについてかなり読む必要があります。これは非常に成熟しており、まだサポートされていますが、オラクルはゴールデンゲートに焦点を当てているため、機能強化に関しては今後あまり期待できません (GG はライセンス製品であるため、Streams はエンタープライズ ライセンスの一部であるのに対し、追加費用が発生します)。

于 2013-03-13T17:22:17.607 に答える