8c7f6c03

Внешний ключ может ссылаться на поля таблицы из другой схемы


Чаще всего родительская и подчиненные таблицы находятся в одной схеме БД Oracle. Не так известно, что родительская и подчиненная таблицы могут находиться в разных схемах. Так как схемы используются для разграничения доступа, возникает вопрос о полномочиях.

Для того, чтобы иметь возможность сослаться внешним ключом на поле таблицы в другой схеме, на это поле должна иметься привилегия REFERENCING. Особо нужно отметить, что с привилегиями SELECT, INSERT, UPDATE и DELETE привилегия REFERENCING никак не связана. Иными словами схема с подчиненной таблицей может ничего не знать о конкретных значениях ключа, на которые есть возможность ссылаться, равно как на наличие других полей в таблице. Пример:

CONNECT / AS SYSDBA

CREATE USER adam IDENTIFIED BY eva DEFAULT TABLESPACE users; GRANT CONNECT, RESOURCE TO adam;

CONNECT scott/tiger

GRANT SELECT ON emp TO adam; GRANT REFERENCES ON dept TO adam;

CONNECT adam/eva

CREATE TABLE emp AS SELECT * FROM scott.emp; ALTER TABLE emp ADD FOREIGN KEY (deptno) REFERENCES scott.dept (deptno); INSERT INTO emp (ename, deptno) VALUES ('ADAM', 10); INSERT INTO emp (ename, deptno) VALUES ('EVA', 50);

Последняя вставка будет вызывать ошибку до тех пор, пока в таблице SCOTT.DEPT не появится запись об отделе 50.

(Привилегия SELECT на таблицу EMP была выдана пользователю ADAM исключительно для возможности скопировать эту таблицу).

Обозначенная выше возможность довольно своеобразна, так как разрушает самодостаточность схемы с точки зрения формирования данных. Если она использована, то ни схема с родительской таблицей, ни схема с подчиненной таблицей уже не могут безоглядно править собственные данные и вынуждены координировать свои действия с данными из других схем.

Тем не менее практика баз данных настолько разнообразна, что указанная возможность иногда может оказаться востребованной.



Содержание раздела