Пример Oracle SQL Код:
create table t1 (
t1a integer,
t1b varchar2(30)
);
alter table t1 add constraint t1_pk primary key (t1a);
insert into t1 values (1, 'A');
insert into t1 values (2, 'B');
create table t11 (
t11a integer,
t1a integer,
t11b varchar2(30)
);
alter table t11 add constraint t11_pk primary key (t11a);
alter table t11 add constraint t11_t1_fk foreign key (t1a) references t1(t1a);
insert into t11 values (10, 1, 'A1');
insert into t11 values (11, 2, 'B1');
create table t12 (
t12a integer,
t1a integer,
t12b varchar2(30)
);
alter table t12 add constraint t12_pk primary key (t12a);
alter table t12 add constraint t12_t1_fk foreign key (t1a) references t1(t1a);
insert into t12 values (20, 1, 'A2');
insert into t12 values (21, 2, 'B2');
create table t1112 (
t11a integer,
t12a integer
);
alter table t1112 add constraint t1112_pk primary key (t11a, t12a);
alter table t1112 add constraint t1112_t11_fk foreign key (t11a) references t11(t11a);
alter table t1112 add constraint t1112_t12_fk foreign key (t12a) references t12(t12a);
create or replace trigger t1112_trg before insert or update on t1112 for each row
declare
t11a_v integer;
t12a_v integer;
begin
select t11.t1a into t11a_v from t11 where t11.t11a = :new.t11a;
select t12.t1a into t12a_v from t12 where t12.t12a = :new.t12a;
if (t11a_v != t12a_v) then
raise_application_error(-20000, 'Mismatch');
end if;
end;
/
Таблица верхнего уровня: t1. t11 и t12 имеют ссылку внешнего ключа на t1. t1112 является таблицей пересечений между t1 и t2. Я хочу убедиться, что все строки, записанные в t1112, имеют комбинацию t11 и t12, так что они обе указывают на одну и ту же строку в t1.
Я попытался реализовать это с помощью триггера в примере. Есть ли способ сделать это через ограничения ссылочной целостности?