【发布时间】:2010-12-12 17:15:49
【问题描述】:
我必须建立一个分布式对象关系系统,在同一个数据库上的两个用户之间进行复制。也就是说,我有一个包含 两个用户 User1 和 User2 的数据库。它们都使用相同的脚本来创建对象类型和表。其中一些表需要在每个用户上具有相同的内容,因此我使用触发器,因此只要一侧发生更改,它就会在另一侧被复制。
假设有一个名为 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。
【问题讨论】:
-
我不明白为什么你不能在每个模式中使用相同的类型名称。是否向用户授予了任何必要的权限,以便他们可以查看和使用彼此的类型?当您插入触发器时,您可以将 NEW 值转换为其他用户的类型吗?如果您可能无法在每个模式中都有一个存储过程来执行插入操作,但这可能只会稍微改变问题。
标签: sql oracle triggers oracle10g ora-00932