【问题标题】:Foreign key reference to a new schema对新模式的外键引用
【发布时间】:2018-06-28 04:28:06
【问题描述】:

我想将一些表移动到新架构。当我移动它时,我在外键引用时遇到错误。我也尝试过授予权限。 Accounts 是地址表所在的旧模式,我将地址移到了一个名为 address 的新模式中。我得到错误表或视图不存在:

CREATE TABLE ACCOUNTS.PARTY_ADDRESS
(
 PARTY_ID NUMBER(18,0),
 ADDRESS_ID NUMBER(18,0),
 CONSTRAINT PARTY_ADDRESS_PK PRIMARY KEY (PARTY_ID, ADDRESS_ID),
 constraint PARTY_ADDRESS_party_fk foreign key (PARTY_ID)
 references PARTY(id),
 constraint PARTY_ADDRESS_ADDRESS_UNQ unique (ADDRESS_ID)
);

ALTER TABLE ACCOUNTS.PARTY_ADDRESS ADD CONSTRAINT PARTY_ADDRESS_address_fk FOREIGN KEY (ADDRESS_ID) REFERENCES ADDRESS.ADDRESS(id);

我也给了地址:

GRANT ALL ON ADDRESS.ADDRESS TO ACCOUNTS;

【问题讨论】:

  • 我认为您需要删除约束并重新创建它们。
  • @GordonLinoff 对不起,我不明白你想说什么
  • 我从不热衷于多模式设计,因为它们使开发、维护、支持和部署变得复杂,而且通常只有很小的好处。通常,当您确实有多个模式时,最好尽量减少它们之间的依赖关系。我认为我在我曾经工作过的任何系统中都没有看到过跨模式外键。

标签: sql oracle


【解决方案1】:

模式需要表权限REFERENCES 才能创建对另一个模式中的表的引用约束。 GRANT ALL 应该有效。在我的测试用例中它确实有效,例如:

架构 1:

create table schema1.t1 (id number primary key);

Table T1 created.

架构 2:

create table schema2.t2 (id number primary key, fk number);

Table T2 created.

alter table schema2.t2 add constraint fktest
  foreign key (fk) references schema1.t1 (id);

ORA-00942: table or view does not exist

架构 1:

grant references on schema1.t1 to schema2;

Grant succeeded.

架构 2:

alter table schema2.t2 add constraint fktest
  foreign key (fk) references schema1.t1 (id);

Table T2 altered.

架构 1:

revoke references on schema1.t1 from schema2;

ORA-01981: CASCADE CONSTRAINTS must be specified to perform this revoke

revoke references on schema1.t1 from schema2 cascade constraints;

Revoke succeeded.

GRANT ALL:

架构 1:

grant all on schema1.t1 to schema2;

Grant succeeded.

架构 2:

alter table schema2.t2 add constraint fktest
  foreign key (fk) references schema1.t1 (id);

Table T2 altered.

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2022-12-07
    • 2013-08-03
    • 2012-07-06
    相关资源
    最近更新 更多