Самый простой способ - создать триггер.В этом случае ищется MANAGER_ID в EMPLOYEE, чтобы подтвердить свою позицию (я также добавил правило, что менеджер должен быть сотрудником филиала, которым они управляют, возможно, вам это не нужно).
create trigger branch_manager_trg
before insert or update on branch_manager
for each row
declare
dummy employee.employee_id%type;
begin
select e.employee_id
into dummy
from employee e
where e.employee_id = :new.manager_id
and e.branch_id = :new.branch_id
and e.emp_type = 'MANAGER';
exception
when no_data_found then
raise_application_error(-20000, 'Branch manager must be a MANAGER');
end;
/
Вот демоверсия LiveSQL (требуется бесплатная учетная запись Oracle Dev Community).
Одна вещь, о которой вы хотите подумать, это то, что должно произойти, если сотрудникзапись менеджера филиала обновлена?Если они больше не МЕНЕДЖЕР или ветвь изменений?
Кстати, я добавил таблицу в вашу модель данных: вам нужна таблица пересечений между EMPLOYEE и BRANCH для хранения записи Branch Manager.В противном случае у вас будет циклическая зависимость между EMPLOYEE.BRANCH_ID -> BRANCH.BRANCH_ID и BRANCH.MANAGER_ID -> EMPLOYEE.EMPLOYEE_ID.