Проверьте, если IF не существует. Project_manager_employee_id (FK) count <3, затем продолжить только для вставки / обновления. в противном случае отправить ошибку

я есть вопрос, где мне нужно ограничить количество проектов, назначенных руководителю, только 3. Таблицы:

Manager:
Manager_employee_id(PK)
Manager_Bonus

Project:
project_number(PK)
Project_cost
Project_manager_employee_id(FK)

Кто-нибудь может подсказать, какой подход предпринять для реализации этого?

 F0XS14 нояб. 2017 г., 08:45
Вы также можете сделать это: вместо0, n отношения междуManager а такжеProject таблица, вы можете ограничить0,3.
 philipxy02 февр. 2018 г., 21:18
Этот вопрос не ясен. Вы имеете в виду ровно 3 или максимум три? Пожалуйста, отредактируйте свой вопрос, не уточняйте в комментариях.
 Pham X. Bach14 нояб. 2017 г., 08:44
Некоторые предложения: 1. Напишите функцию F, чтобы проверить это, и вызовите F, когда вы ВСТАВИТЕ / ОБНОВИТЕproject Таблица. 2. Используйте триггер наproject Таблица.
 APC14 нояб. 2017 г., 08:46
@foxcy - это то, как смоделировать ограничение. ОП спрашивает, каквоплощать в жизнь такое ограничение.
 Jamie Schaffer14 нояб. 2017 г., 08:47
Как мне реализовать ограничение до 0,3?

Ответы на вопрос(3)

Для этого требуется утверждение, которое определено в стандарте SQL, но не реализовано в Oracle. (Хотя естьдвижется, чтобы представить их).

Что вы можете сделать, так это использовать материализованное представление для его прозрачного применения.

create materialized view project_manager
refresh on commit 
as 
select Project_manager_employee_id
        , count(*) as no_of_projects
from project
group by Project_manager_employee_id
/

Магия это:

alter table project_manager
   add constraint project_manager_limit_ck check 
       ( no_of_projects <= 3 )
/

Это контрольное ограничение предотвратит обновление материализованного представления, если число проектов для менеджера превысит три, что приведет к сбою вставки или обновления при инициировании. По общему признанию это не изящно.

Поскольку mview обновляется при фиксации (т. Е. Транзакционно), вам необходимо создать журналproject Таблица:

create materialized view log on project

Создайте один SP для обеих операций вставки / обновления.Проверьте, если IF не существует. Project_manager_employee_id (FK) count <3, затем продолжить только для вставки / обновления. в противном случае отправить ошибку

Создать новый столбецprojects_taken (tinyint) (1) (принимает значения1,2 или же3) со значением по умолчанию0.
Когда менеджер принимает проект, поле будет увеличиваться на1
Сделайте простые проверки (через пользовательский интерфейс), чтобы увидеть, если полеprojects_taken равно или меньше чем3.
 APC14 нояб. 2017 г., 09:03
Так грустно, что ты упал в последний барьер Если у нас возникнут проблемы с добавлением и заполнением столбца, почему бы нам не создать проверочное ограничение для его применения? Уроки истории заключаются в том, что использование приложения для обеспечения соблюдения бизнес-правил неизбежно ведет к повреждению данных.

Ваш ответ на вопрос