Вопрос

У меня есть таблица department с несколькими битовыми полями для указания типов отделов Одно из них - Склад (при значении true укажите, что отдел является складом)

И у меня есть еще одна таблица, ManagersForWarehouses со следующей структурой:

ID autoinc
WarehouseID int (foreign key reference DepartmentID from departments)
ManagerID int (foreign key reference EmployeeID from employees)
StartDate
EndDate

Чтобы установить нового менеджера для склада, я вставляю в эту таблицу значение EndDate null , и у меня есть триггер, который устанавливает EndDate для предыдущей записи для этого склада = StartDate для нового менеджера, поэтому в определенное время для склада появляется один менеджер.

Я хочу добавить два контрольных ограничения следующим образом, но не уверен, как это сделать

  1. не разрешайте вставлять в ManagersForWarehouses, если WarehouseID не помечен как склад
  2. Не разрешайте снимать флажок Склад, если есть записи в ManagersForWarehouses

Спасибо

Это было полезно?

Решение

  1. В таблице Departments добавьте уникальное ограничение (DepartmentID, IsWarehouse).
  2. В таблице ManagersForWarehouses добавьте столбец IsWarehouse и примените контрольное ограничение, которое IsWarehouse='Y'
  3. В таблице ManagersForWarehouses добавьте FK on (WarehouseID , IsWarehouse), ссылающийся на отделы (DepartmentID, IsWarehouse), и с предложением ON UPDATE CASCADE.

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

Другие советы

Для этого вы должны использовать триггеры.По одному на каждом столе.Убедитесь, что учитывается несколько вставок, обновлений или удалений записей.Делать что-либо еще означало бы подвергать ваши данные риску.Данные попадают в базы данных не только из приложений.Вы не можете позволить себе применять подобные действия из приложения, если только вам не нужны неверные и бесполезные данные.

Не накладывайте такого рода ограничения на таблицу базы данных.
Лучше обеспечить выполнение такой вещи с помощью кода (бизнес-логика).

Редактировать:Не связано с вашим вопросом, но вы также не должны использовать триггер для выполнения обновлений других строк.У меня нет надежных ссылок, чтобы подкрепить это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top