Как построить триггер, который вложен, если - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть три таблицы:

  1. Проект - сохраняет все детали проекта.ProNo является первичным ключом.

  2. Персонал - хранит все данные о персонале.StaffNo - это первичный ключ.

  3. ProjectStaff - показывает, кто выполняет проект, а также связующее звено между проектом и персоналом.Он имеет позицию каждого сотрудника в проекте.ProNo и StaffNo являются внешними ключами.

Сотрудник может быть назначен на несколько проектов одновременно, но у проекта может быть только один руководитель.

Поскольку я хочу убедиться, что в таблице ProjectStaff у каждого ProNo может быть только один «лидер».

Должен ли я использовать вложенный If или Case для реализации его в триггере?И как мне это реализовать?

Так как я всего лишь новичок в SQL, мне действительно нужно кое-что по этому поводу, я действительно ценю это!

1 Ответ

0 голосов
/ 14 апреля 2019

Вы не разместили структуры таблиц, но эту проблему легко решить с помощью правильной проекции для таблицы пересечений ProjectStaff.Я бы решил эту проблему, поместив столбец ROLE_TYPE (т. Е. Является ли сотрудник руководителем или ведомым) на этой таблице.

Чтобы эта таблица выглядела следующим образом:

create table projectstaff (
     projectno varchar2(5) not null
     , staffno varchar2(5) not null
     , roletype varchar2(10) constraint projectstaff_role_ck check (roletype in ('Leader', 'Minion'))
     , constraint projectstaff_pk primary key (projectno, staffno)
     , constraint projectstaff_project_fk foreign key (projectno) references project         
     , constraint projectstaff_staff_fk foreign key (staffno) references staff
);

Тогдамы создали уникальный основанный на функции индекс , который позволяет нам применять правило, согласно которому в проекте может быть только один сотрудник с назначенным ROLETYPE «Лидер».

create unique index projectstaff_uidx on projectstaff
    (projectno, case when roletype = 'Leader' then roletype else staffno end)
;
...