【问题标题】:Oracle 10: Locally distributed system, problems with UDTOracle 10:本地分布式系统,UDT 的问题
【发布时间】:2010-12-12 17:15:49
【问题描述】:

我必须建立一个分布式对象关系系统,在同一个数据库上的两个用户之间进行复制。也就是说,我有一个包含 两个用户 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。

【问题讨论】:

  • 我不明白为什么你不能在每个模式中使用相同的类型名称。是否向用户授予了任何必要的权限,以便他们可以查看和使用彼此的类型?当您插入触发器时,您可以将 NEW 值转换为其他用户的类型吗?如果您可能无法在每个模式中都有一个存储过程来执行插入操作,但这可能只会稍微改变问题。

标签: sql oracle triggers oracle10g ora-00932


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    “有没有一样的方法 两个用户使用的对象类型?”

    嗯,最简单的方法是让 NT_AreasInDepartment 仅由用户 1 拥有,用户 1 将其执行权限授予用户 2。但是,如果您希望两个架构共享相同的脚本——这肯定会更容易管理复制的环境——然后引入一个新架构 User0,它拥有所有对象并将它们的 EXECUTE 授予 both用户。

    【讨论】:

    • 我认为只创建一次类型是最好的方法。为了让生活更轻松,我只需在 USER2 中创建一个同义词,指向 USER1 中的类型。因此对于麻烦的用户来说,类型“看起来”相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2013-04-02
    相关资源
    最近更新 更多