【问题标题】:Oracle table referencing a table from another schemaOracle 表引用另一个模式中的表
【发布时间】:2012-02-27 06:39:52
【问题描述】:

当涉及到多模式设置时,我无法理解 Oracle 中哪些是可能的,哪些是不可能的。假设我有两个模式 AB

-- with user SYS connect as SYSDBA
-- note: ALL PRIVILEGES are granted for simplicity in the scope of this question.
--       real life databases would have more fine-grained grants...
create user A identified by A;
grant all privileges to A;

create user B identified by B;
grant all privileges to B;

-- with user A
create table A.REFERENCED_TABLE (
  ID number(7) not null,
  constraint REFERENCED_TABLE_PK primary key (ID)
);

-- with user A or B
create table B.REFERENCING_TABLE (
  A_ID number(7) not null,
  constraint REFERENCING_TABLE_FK 
    foreign key (A_ID) 
    references A.REFERENCED_TABLE(ID)
    on delete cascade
);

但上述说法导致

ORA-01031: insufficient privileges

如何使一个架构中的表引用另一个架构中的表?是否还有一些GRANT 失踪?这甚至可能吗?

【问题讨论】:

    标签: sql oracle foreign-keys schema grant


    【解决方案1】:

    有两种不同的权限:系统权限和对象权限。

    GRANT ALL PRIVILEGES TO user;
    

    会将所有系统权限授予用户,使用时应非常小心!

    GRANT ALL ON table TO user;
    

    将表(即对象)上的 SELECT、INSERT 等授予用户。

    所以你需要做一个...

    GRANT ALL ON a.referenced_table TO b;
    

    ...在 CREATE TABLE A.REFERENCED_TABLE 语句之后,上面的工作。

    【讨论】:

    • 太好了,谢谢!我没有想到对引用表的必要授权。系统权限的好提示。不过,就我而言,这只是一个测试数据库,所以GRANT ALL PRIVILEGES 很好。
    • @LukasEder:如果你不想授予所有权限,授予SELECTREFERENCES应该足够了
    • @Ben:我故意让问题简短。我需要一个包含两个模式中的两个表的集成测试用例情况,以便我可以查询它们的字典视图。我正在为jooq.org(Java 的 SQL 抽象库)执行此操作,因此潜在的“实时”环境在这种情况下确实无关紧要。我用附加评论更新了问题
    【解决方案2】:

    对于大多数企业环境来说,Grant all 太过分了。请改用 Grant 引用。

    将 schema.tablename 上的引用授予 target_schema 或用户;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      相关资源
      最近更新 更多