0

我必须建立一个分布式对象关系系统,在同一数据库上的两个用户之间进行复制。也就是说,我有一个包含两个用户 User1User2的数据库。它们都使用相同的脚本来创建对象类型和表。其中一些表需要在每个用户上具有相同的内容,因此我使用触发器,因此只要一侧发生更改,它就会在另一侧复制。

假设有一个名为DepartmentType的 UDT和另一个名为AreaType的 UDT 。每个Area都与一个Department相关,一个Department可能包含多个Area。因此,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());

但它也不起作用。在 oracle 官方论坛中,他们告诉我我可以使用相同的对象标识符来创建类型,但鉴于两个用户都在同一个系统中,这是不可能的。

有没有办法让两个用户使用相同的对象类型?

免责声明:可能这看起来很奇怪,并且可能有更简单的方法可以做到这一点,但恐怕这是我被要求的。也就是说,是的,这是一项大学作业。如果由我决定,我什至不会使用 Oracle。

4

2 回答 2

2

是的,它看起来确实很丑。我首先会选择一个同时被 user1 和 user2 引用的 UDT。

如果做不到这一点,我想要一些明确的函数,将 user1.udt 分解为其组件(VARCHAR2、数字、日期等)并在调用 user2.udt 构造函数时使用它们。反之亦然。

基于 XML 的提取/构造函数也值得考虑(尤其是在生产环境中,如果 UDT 定义有可能会失步,而在现实生活中几乎肯定会出现这种情况)。

于 2010-12-12T23:00:20.250 回答
1

因此,问题在于 Oracle 对其用户定义类型强制执行强类型。没关系User1.NT_AreasInDepartment并且User2.NT_AreasInDepartment 共享相同的签名:它们在不同的模式中声明,因此就数据库而言是不同的对象。

“有没有办法让两个用户使用相同的对象类型?”

好吧,最简单的方法是NT_AreasInDepartment仅由 User1 拥有,后者将 EXECUTE 授予 User2。但是,如果您希望两个模式共享相同的脚本——这肯定会使管理复制环境变得更容易——然后引入一个新模式 User0,它拥有所有对象并将 EXECUTE 授予两个用户。

于 2010-12-12T23:59:58.193 回答