【问题标题】:Add FOREIGN KEY CONSTRAINT between different owners在不同所有者之间添加 FOREIGN KEY CONSTRAINT
【发布时间】:2012-10-05 09:32:03
【问题描述】:

我以 SYSTEM 用户身份登录 Oracle XE 实例。当我尝试运行创建用户、表和约束的脚本时,我收到ORA-01031 错误。脚本如下:

CREATE USER AA IDENTIFIED BY AA DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
CREATE USER BB IDENTIFIED BY BB DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT ALL PRIVILEGES TO AA WITH ADMIN OPTION;
GRANT ALL PRIVILEGES TO BB WITH ADMIN OPTION;
...
CREATE TABLE ...
CREATE INDEX ...
...
ALTER TABLE "BB"."B_TABLE" ADD CONSTRAINT "FK_BB_AA" FOREIGN KEY ("AA_ID")
  REFERENCES "AA"."A_TABLE" ("ID") ENABLE; -- this line report the error

不能在 Oracle XE 上添加这个约束吗?

【问题讨论】:

    标签: oracle-xe


    【解决方案1】:

    首先,绝不应该将ALL PRIVILEGES 授予用户,尤其是不授予WITH ADMIN OPTION 的情况。这只是管理安全性的一种糟糕方法。在任何近似真实系统的情况下,您都希望确定实际需要哪些权限并仅授予这些权限。

    其次,为了使架构BB 中的外键引用AA 中的父表,BB 必须对AA 中的父表具有REFERENCE 特权。由于没有REFERENCE ANY TABLE 系统权限,因此您需要在创建表之后但在创建外键之前授予BBAA.A_TABLEREFERENCE 权限。

    GRANT REFERENCES ON aa.a_table TO bb;
    

    【讨论】:

    • 这不是真正的数据库,我正在使用 Oracle XE 对我的应用程序进行集成测试,我在真正的数据库服务器上没有 dba 权限。而且我不只有这两个用户,我有 11 个用户和大约 70 个表。我必须对所有表和用户运行此命令,还是有更简单的方法?
    • 您需要为希望能够创建该对象的子表的每个用户的每个对象运行该语句。有 11 个用户,每个用户都基于 70 个不同的父表创建子表,这似乎非常非常奇怪——如果你有多个这样的跨模式外键,那么识别什么模式的方法很可能你需要的是有问题的。也就是说,您可以编写一些动态 SQL 来生成并执行该语句的所有 770 种组合。
    • 我就是这么做的。创建动态 SQL 以生成组合。感谢您的提示。
    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    相关资源
    最近更新 更多