Nie można tego zrobić za pomocą samego ograniczenia sprawdzającego, ale istnieje sposób na użycie zmaterializowanego widoku i ograniczenia sprawdzającego, jak demonstruję tutaj na moim blogu . Dla twojego przykładu byłoby to:
create materialized view emp_dep_mv
build immediate
refresh complete on commit as
select emp_id, count(*) cnt
from relatives
group by emp_id;
alter table emp_dep_mv
add constraint emp_dep_mv_chk
check (cnt <= 3)
deferrable;
Jednak to podejście może nie być skuteczne w przypadku dużej, zajętej produkcyjnej bazy danych, w takim przypadku można wybrać podejście, które wykorzystuje wyzwalacze i ograniczenie sprawdzające oraz dodatkową kolumnę w tabeli Pracownicy:
alter table employees add num_relatives number(1,0) default 0 not null;
-- Populate for existing data
update employees
set num_relatives = (select count(*) from relatives r
where r.emp_id = e.emp_id)
where exists (select * from relatives r
where r.emp_id = e.emp_id);
alter table employees add constraint emp_relatives_chk
check (num_relatives <= 3);
create trigger relatives_trg
after insert or update or delete on relatives
for each row
begin
if inserting or updating then
update employees
set num_relatives = num_relatives + 1
where emp_id = :new.emp_id;
end if;
if deleting or updating then
update employees
set num_relatives = num_relatives - 1
where emp_id = :old.emp_id;
end if;
end;