Как обеспечить соблюдение бизнес-правила в таблицах базы данных? - PullRequest
0 голосов
/ 19 мая 2018

Я работаю над проектом базы данных БАНКОВСКОЙ СИСТЕМЫ УПРАВЛЕНИЯ (oracle) для разработчика sql, и я добился определенного прогресса, но я застрял в этой незначительной проблеме

Проблема: у меня есть таблица employeeс employee id в качестве первичного ключа и в этой таблице есть атрибут position (клерк, менеджер и т. д.) и branch id (ветвь, в которой работает этот сотрудник), который является внешним ключом (ссылается на branch_idbranch таблица).Затем есть таблица branch с branch id в качестве первичного ключа и manager_id в качестве внешнего ключа (ссылка на таблицу employee_id из employee).

Какой тип запроса мне следует написатьобеспечить, чтобы сотрудник, являющийся руководителем этого филиала, также использовал термин «менеджер» в качестве своей должности.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Самый простой способ - создать триггер.В этом случае ищется 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.

0 голосов
/ 19 мая 2018

Что-то вроде

SELECT * FROM branch 
INNER JOIN employee ON branch.manager_id = employee.employee_id 
WHERE position LIKE "%Manager%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...