2009-09-10 134 views
1

我有一個表,部門,有幾個位字段,表示部門類型 一個是倉庫(如果爲true,表明該部門是倉庫)檢查約束

而且我還有一個表,有以下ManagersForWarehouses結構:

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

要設置倉庫新經理,我插入此表與結束日期爲空,我有一個觸發器,它設定結束日期爲此前的紀錄爲倉庫=起始日期爲新的經理,所以單經理出現在某個時間倉庫。

我要添加兩個檢查約束如下,但不知道如何做到這一點

  1. 不允許插入ManagersForWarehouses如果WarehouseID沒有被標記爲倉庫
  2. 不要允許取消倉庫如果在ManagersForWarehouses記錄

感謝

+0

「2.如果在ManagersForWarehouses中有記錄,則不允許取消選中倉庫」 - 您的意思是這個或者是否有活動記錄(您確實有結束日期是我問的原因) – HLGEM 2009-09-10 19:01:49

+0

@HLGEM - 我的意思是,如果我已經設置了ManagerForWarehouse,不允許我將Warehouse標誌字段(位)從1設置爲0 – bzamfir 2009-11-10 22:05:41

回答

1
  1. 在部門表中,添加一個唯一約束(DepartmentID的,IsWarehouse)
  2. 在ManagersForWarehouses表中,添加列IsWarehouse,並有一個CHECK約束強制執行IsWarehouse = 'Y'
  3. 在ManagersForWarehouses表中,添加(WarehouseID,IsWarehouse)上的FK參考部門(DepartmentID,IsWarehouse)和ON UPDATE CASCADE子句。

而且你們都是100%堅實的完整,沒有任何漏洞。只有可信的約束沒有任何漏洞。觸發器不太可靠。

+0

謝謝你的想法。 – bzamfir 2010-05-22 17:59:29

-1

不要把這種對數據庫表的約束。
使用代碼(業務邏輯)強制執行這樣的事情會更好。

編輯:不涉及到你的問題,但你不應該使用觸發器以及更新其他行。我沒有可靠的鏈接來支持它。

+1

否,它必須在數據庫中或數據完整性將會丟失!這是不可行的,必須在數據庫級別執行。 – HLGEM 2009-09-10 18:55:15

+0

@HLGem:小心解釋爲什麼?以及如何執行這種特定類型的約束? – shahkalpesh 2009-09-10 19:53:36

+0

如果約束支持數據完整性,則只能將約束添加到數據庫,而不是在需要的地方編碼。 – supertopi 2012-08-23 09:01:21

0

你應該使用觸發器來做到這一點。每桌上有一個。確保考慮多個記錄插入,更新或刪除。做任何事情都會讓你的數據處於危險之中。數據不會從應用程序進入數據庫。除非你需要不正確和無用的數據,否則你不能從應用程序中執行這類事情。

+0

@HLGEM:數據如何進入數據庫?如果有數據從應用程序之外的數據源移動到數據庫中,那麼你是對的。 – shahkalpesh 2009-09-10 19:55:03

+0

是的,我知道我應該使用觸發器,但不知道這些觸發器應該是什麼樣子。我更像一個應用程序開發人員,而不是數據庫人員,所以不知道Tsql那麼好。但我可以在一些方向上處理它。謝謝 – bzamfir 2009-11-10 22:09:24

+1

爲什麼使用觸發器時它很容易實現約束? – 2010-05-21 13:21:26