2008-12-10 144 views
3

我有以下情況。主表和許多其他表與外鍵鏈接在一起。現在,當我想要刪除主表中的一行時,會發生ConstraintsViolation,這是有意的,也是很好的。在SQL Server中刪除之前可以檢查約束嗎?

現在我希望能夠在觸發刪除行事件之前檢查ConstraintsViolation是否會發生。

這可能嗎?

回答

1
If Exists (Select * From OtherTable 
      Where OtherTableFKColumn = MainTablePrimaryKey) 
    Begin 
     Rollback Transaction 
     RaisError('Violating FK Constraint in Table [OtherTable]', 16, 1) 
    End 
+1

確定這是一種有效的方法,但是如果稍後某人添加了鏈接到此表的其他表。然後這個代碼必須改變。 – Drejc 2008-12-10 17:54:23

+0

哦,對於每個有主鍵的FK的表,你都需要其中的一個...如果該列表發生變化,那麼是的,這個代碼將不得不被修改,以爲該另外的表添加額外的語句。 – 2008-12-10 18:07:53

1

除了檢查每個相關表的COUNT(*)?我不這麼認爲。

0

一個醜陋的嘗試將是在事務中嘗試DELETE,如果成功則強制ROLLBACK。但這對我的口味來說很髒。

+0

他不是說他想在DELETE之前做檢查嗎? – FelixM 2009-11-27 21:02:18

0

這是一個問題,表面上看起來不錯,但有影響。

首先,你需要確保你讀過這些關係的狀態後,沒有人可以改變的,所以很明顯,你需要使用事務和問題鎖定行。

然後,你需要一種方法來找出檢查什麼關係,因爲我在這裏評論你看到的問題,如果有人後來添加一個新的關係會發生什麼。因此,您需要查詢模式,或者可以從模式中自動生成此代碼,以便每次更改模式時都需要運行檢測機制。

現在,在這個折磨之後,你真的看起來很貴嗎?

0

我不認爲這是一個好主意,嘗試這樣的事情,因爲這意味着每一個外鍵必須檢查兩次:一次是由你先,然後再由當你執行你的SQL服務器。性能影響可能很嚴重。

但是,如果您已將自己的想法設置爲這樣做,那麼最通用的方法就是使用數據庫的數據字典。我不熟悉SQL Server數據字典,但其他關係數據庫將其所有元數據存儲在數據庫表中,您可以查詢。您可以找到引用您的表的所有外鍵,並動態構建查找相關行的查詢。