Overview
Oracle allows you to create a Foreign Key Constraint across the schema border using
the REFERENCES privilege. As an example lets create the following
situation.

The Table DEPT in the Schema JONES is referenced by the Table
EMP in Schema Scott.
Create the Tables
CREATE USER jones IDENTIFIED BY tiger
TEMPORARY TABLESPACE temp
DEFAULT TABLESPACE users;
GRANT CREATE SESSION TO jones;
GRANT DBA TO jones; -- For simplicity, we give it DBA
Privileges
CREATE USER scott IDENTIFIED BY tiger
TEMPORARY TABLESPACE temp
DEFAULT TABLESPACE users;
GRANT CREATE SESSION TO scott;
GRANT DBA TO scott; -- For simplicity, we give it DBA
Privileges
CREATE TABLE JONES.DEPT
(
deptno NUMBER(2),
dname VARCHAR2(14 BYTE),
loc VARCHAR2(13 BYTE)
);
CREATE UNIQUE INDEX jones.pk_dept ON jones.dept (deptno);
ALTER TABLE jones.dept ADD (
CONSTRAINT pk_dept
PRIMARY KEY (deptno);
CREATE TABLE scott.emp
(
empno NUMBER(4) NOT NULL,
ename VARCHAR2(10 BYTE),
job VARCHAR2(9 BYTE),
mgr NUMBER(4),
hiredate DATE,
sal NUMBER(7,2),
comm NUMBER(7,2),
deptno NUMBER(2)
);
CREATE UNIQUE INDEX scott.pk_emp ON scott.emp (empno);
ALTER TABLE scott.emp ADD (
CONSTRAINT pk_scott
PRIMARY KEY (empno));
Create the Foreign Key across Schema Border
If we try to create the Foreign Key Constraint we will get an
ORA-00942
ALTER TABLE scott.emp ADD (
CONSTRAINT fk_emp_dept
FOREIGN KEY (deptno)
REFERENCES jones.dept (deptno));
ORA-00942: table or view does not exist
The reason for this error is, that the User SCOTT cannot «see» the Table DEPT in Schema
JONES - he needs the REFERENCES Privilege.
GRANT REFERENCES, UPDATE ON jones.dept TO SCOTT;
Grant succeeded.
ALTER TABLE scott.emp ADD (
CONSTRAINT fk_emp_dept
FOREIGN KEY (deptno)
REFERENCES jones.dept (deptno));
Table altered.
Pitfalls with such a Construct
A Foreign Key which passes over its own Schema Border will imply a Dependency between
the Schemas. In the example there is now a Relationship between the two Schemas SCOTT and
JONES. That means Schema SCOTT is dependent on Schema JONES. This is often difficult to
handle, specially when Schemas are scripted - you will get Errors if the Order is not
considered.
When you try to REVOKE the Privilege, you will get ORA-01981
REVOKE ALL ON jones.dept FROM scott; ORA-01981: CASCADE CONSTRAINTS must be specified to perform this
revoke
REVOKE ALL ON jones.dept FROM scott CASCADE
CONSTRAINT; Revoke succeeded.
However whats happen here ?
| Revoking SCOTT REFERENCES privilege on JONES.dept causes Oracle to drop the fk_emp_dept constraint, because SCOTT required the privilege to define the constraint. |
Conclusion
Oracle allows References between Schemas using the REFERENCES Privilege. However we
suggest not to use it due to complexity, dependency and the danger that Foreign Key
Constraints are dropped in the «Background» when using CASCADE CONSTRAINT;
|