0

同じデータベース上の 2 人のユーザー間でレプリケーションを行う分散オブジェクト リレーショナル システムをセットアップする必要があります。つまり、User1User2の 2 人のユーザー を持つデータベースを取得しました。どちらも同じスクリプトを使用して、オブジェクト タイプとテーブルを作成します。これらのテーブルの一部は、各ユーザーに同じ内容を持たせる必要があるため、トリガーを使用しているため、一方に変更があると、反対側に複製されます。

DepartmentTypeという名前の UDT と、AreaTypeという名前の別の UDT があるとします。各エリアは 1 つの部門に関連付けられており、1 つの部門に複数のエリアが含まれる場合があります。したがって、AreaType には DepartmentType への参照があり、DepartmentType には AreaTypes への参照のネストされたテーブルがあります。このネストされたテーブルのタイプはNT_AreasInDepartment (たとえば) です。どちらのタイプにも Name という主キーがあります。これは Department テーブルへの挿入のトリガーです。

CREATE OR REPLACE TRIGGER NewDept
AFTER INSERT
ON DeptObj
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
   INSERT INTO DIST_DeptObj VALUES (:NEW.Name, :NEW.Areas);
END NewDept;
/

機能しません。User1.NT_AreasInDepartment が予期されていましたが、User2.NT_AreasInDepartment が見つかったと表示されます (エラー ORA-00932)。私が使用する場合

INSERT INTO DIST_DeptObj VALUES (:NEW.Name, :NULL);

動作しますが、後でネストされたテーブルにレコードを挿入できません。私も次のようなものを使用してみました

INSERT INTO DIST_DeptObj VALUES (:NEW.Name, NT_AreasInDepartment());

しかし、それも機能しません。オラクルの公式フォーラムで、同じオブジェクト識別子を使用してタイプを作成できると彼らは私に言いましたが、両方のユーザーが同じシステムにいる場合、それは不可能です。

2 人のユーザーが同じオブジェクト タイプを使用する方法はありますか?

免責事項: おそらくこれは奇妙に見えますが、これを行うより簡単な方法があるかもしれませんが、これが私が要求したものです。つまり、はい、これは大学の課題です。私だったら、オラクルすら使っていないでしょう。

4

2 に答える 2

2

はい、それは醜く見えます。まず、user1 と user2 の両方から参照される単一の UDT を選択します。

それができない場合は、user1.udt をそのコンポーネント (VARCHAR2、数値、日付など) に分割し、それらを user2.udt コンストラクターの呼び出しで使用する明示的な関数が必要です。およびその逆。

XML ベースの抽出/コンストラクターも検討する価値があります (特に実稼働環境では、UDT 定義がずれてしまう可能性があり、実際にはほぼ確実にそうなる可能性がある場合)。

于 2010-12-12T23:00:20.250 に答える
1

したがって、問題は、Oracle がそのユーザー定義型に厳密な型指定を強制することです。それは問題ではなく、同じ署名User1.NT_AreasInDepartmentUser2.NT_AreasInDepartment 共有します。データベースに関する限り、それらは別々のスキーマで宣言されているため、異なるオブジェクトです。

「2 人のユーザーが同じオブジェクト タイプを使用する方法はありますか?」

最も簡単な方法は、NT_AreasInDepartmentUser1 だけが所有し、その EXECUTE を User2 に付与することです。ただし、両方のスキーマで同一のスクリプトを共有し、複製された環境の管理が確実に容易になるようにする場合は、新しいスキーマ User0 を導入します。これは、すべてのオブジェクトを所有し、両方のユーザーにそれらに対する EXECUTE を付与します。

于 2010-12-12T23:59:58.193 に答える