检查表查找的约束

时间:2009-09-10 17:48:12

标签: sql sql-server tsql triggers constraints

我有一个表,部门,有几个位字段来表示部门类型 一个是仓库(当为真时,表明部门是仓库)

我还有一个表,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. 如果WarehouseID未标记为仓库
  2. ,则不允许插入ManagersForWarehouses
  3. 如果ManagersForWarehouses中有记录
  4. ,则不允许取消选中仓库

    由于

3 个答案:

答案 0 :(得分:1)

  1. 在Departments表中,添加唯一约束(DepartmentID,IsWarehouse)
  2. 在ManagersForWarehouses表中,添加列IsWarehouse,并使CHECK约束强制执行IsWarehouse ='Y'
  3. 在ManagersForWarehouses表中,添加FK on(WarehouseID,IsWarehouse)引用Departments(DepartmentID,IsWarehouse)和ON UPDATE CASCADE子句。
  4. 你们都拥有100%坚如磐石的完整性,没有任何漏洞。只有受信任的约束没有任何漏洞。触发器不太可靠。

答案 1 :(得分:0)

您应该使用触发器来执行此操作。每张桌子一个。确保考虑多个记录插入,更新或删除。做任何其他事情都会使您的数据面临风险。数据不会仅从应用程序进入数据库。除非您希望数据不正确且无用,否则您无法从应用程序中强制执行此类操作。

答案 2 :(得分:-1)

不要在数据库表上加上这种约束 最好使用代码(业务逻辑)来强制执行此类操作。

编辑:与您的问题无关,但您也不应使用触发器对其他行执行更新。我没有可靠的链接支持它。