2010-06-15 109 views
10

可能重複:
Are database triggers evil?數據庫觸發器何時壞?

有很多的數據庫觸發器負面信息,只希望得到社會各界人士是時好時壞VS在起飛。

+1

這是因爲新手在沒有適當的知識的情況下使用它們來知道存在更好的替代方案。 IE:「嘿,我想做X.我知道,我會用一個觸發器......「當檢查或默認約束更好或者更差時 - 外鍵約束 – 2010-06-15 19:28:11

+0

(關於我對這個問題的近距離投票:我知道你已經提出了一些問題不同於我所建議的,但我覺得對另一個問題的答案已經討論了關於數據庫觸發器的正面和負面的事情......不會回答你的問題嗎?) – stakx 2010-06-15 19:30:41

+3

@stakx同意我沒有搜索這個詞是邪惡的 – 2010-06-15 19:35:22

回答

9

我認爲他們可以用來爲安全性或創建元數據等方面填充單獨的一次性表集合,例如記錄,聚合等。

當您開始更改您的「實時」數據或「循環回」到您的biz信息表中時,那就是當它們變得邪惡和笨拙時。他們對此也完全沒有必要。觸發器沒有任何存儲過程無法做到的事情。

我覺得他們是SQL在編程語言中等同於GOTO的惡魔。合法,但要避免,除非絕對必要,而且它們絕對不是絕對必要的。

+0

謝謝你保羅,但你說他們絕對沒有必要! 有沒有更好的方法使日誌記錄更新,從表中刪除? – 2010-06-30 14:01:48

5

因爲他們是「魔術師」。他們不是很明顯,他們可以做很多工作。

我見過很多優秀的開發人員花費大量時間來追蹤觸發相關的問題,因爲他們只是不想去尋找它們。此外,他們很少需要。

+0

我今天大部分時間都在尋找一個不存在更新的存儲過程的神祕更新語句,長話短說它是發佈更新的表上的觸發器 – CTKeane 2010-06-15 20:18:18

+2

這並不意味着觸發器是一件壞事,這意味着開發者沒有得到適當的培訓。 – HLGEM 2010-06-15 21:33:21

+2

@HLGEM,開發者不會(也不能)知道一切!關鍵是將代碼放入觸發器中可以不必要地隱藏它。 – CrazyTim 2012-08-10 05:26:34

7

當其他功能更合適時,使用數據庫觸發器時會導致數據庫觸發器不良。

檢查約束

外鍵約束

唯一索引/約束

(持久化的)計算列

(:應嘗試使用觸發器前應考慮

特點索引)視圖(如果觸發器正在嘗試類似更新聚合的內容,比如說)

存儲過程(如果直接訪問表可以禁止)

在這之後,觸發器可以適當地使用而不被「壞」。觸發器應該始終設計爲佔用空間小。