Проверьте ограничение при поиске в таблице - PullRequest
1 голос
/ 10 сентября 2009

У меня есть таблица, отдел, с несколькими битовыми полями для указания типов отделов Один из них - Склад (при значении 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 есть записи

Спасибо

Ответы [ 3 ]

1 голос
/ 21 мая 2010
  1. В таблице «Отделы» добавьте уникальное ограничение (DepartmentID, IsWarehouse)
  2. В таблице ManagersForWarehouses добавьте столбец IsWarehouse и установите ограничение CHECK, чтобы IsWarehouse = 'Y'
  3. В таблице ManagersForWarehouses добавьте FK для (WarehouseID, IsWarehouse) со ссылкой на отделы (DepartmentID, IsWarehouse) и с предложением ON UPDATE CASCADE.

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

0 голосов
/ 10 сентября 2009

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

0 голосов
/ 10 сентября 2009

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

РЕДАКТИРОВАТЬ: Не относится к вашему вопросу, но вы не должны также использовать триггер для обновления других строк. У меня нет твердых ссылок, чтобы подтвердить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...