2012-05-15 45 views
2

我只是對使用複合觸發器有一個很快的問題。Oracle 11g複合觸發器的應用

我很新的數據庫/ SQL/Oracle和具有UNI任務在那裏我不得不下列創建觸發器:

  1. 插入日誌表時,銷售人員創建一個訂單
  2. 在訂單表上更新訂單準備發貨(加插入日誌)
  3. 防止在週一下午5點週五下午5點之前進行INSERT,UPDATE和DELETE。

我已經成功實現了觸發器,但剛剛意識到了11g中的複合觸發器。將上述內容合併成一個複合觸發器是否合適?這是他們的目標還是我錯過了這一點?

非常感謝您看到這個相當模糊的問題。

回答

3

海事組織它不適合。複合觸發器允許您捕捉給定表上給定操作的四個不同觸發點(在語句之前,動作之前,動作之後和語句之後),但它看起來像A)您在多個表上觸發,並且B)你不需要服務所有不同的觸發點。 (順便說一下,我在這裏使用過的「action」可能意味着不同的語句類型,例如,INSERT,UPDATE,DELETE ...之前)。

複合觸發器爲解決不受歡迎的ORA-04091 MUTATING TABLE錯誤提供了一個很好,乾淨且緊湊的方法,但大多數情況下,我沒有發現它們作爲一般用途是必需的或有用的 - 所有替換爲「正常」的觸發器。例如,請參閱我對this question的回答。

分享和享受。

+0

我明白了,所以(當然,這是一個uni項目,並且總是被告知用一個龐大的數據庫大量觸發器/表/元組),在插入日誌表(觸發器1和2)之前使用compoung觸發器檢查日期時間(觸發器3)是不正確的? –

+1

正確定義:-)是一件困難的事情,但我個人不希望這樣,主要是因爲所有觸發點,你實際上並不需要。我想1和2是AFTER INSERT行觸發器,而3將是BEFORE INSERT,UPDATE,DELETE語句觸發器。但是,看看它,我會對觸發器中的2和3持懷疑態度 - 觸發器的第一個規則(好吧,OK,* MY *觸發器的第一個規則)是「你不應該在觸發器中實現業務邏輯,這是瘋狂河上的山坡上的滑坡!「。因人而異。 –

1

哇 - 複合觸發器 - 不知道他們甚至存在......

我連忙擡頭the documentation

的主要原因使用複合觸發器解釋如下:

複合觸發器可讓您更輕鬆地編寫一種方法,您可以在其中爲各個時間點實施的操作共享 公用數據。要使用簡單的觸發器實現相同的效果,您需要使用 來爲輔助包中的常見狀態建模。當 觸發語句導致錯誤,並且語句後語句觸發器 未觸發時,此方法爲編程繁瑣且易受內存泄漏影響的 。

所以,除非你需要包變量來實現你的功能,否則沒有理由使用它們。而且你的代碼不再兼容10g。

+0

謝謝。我已經看到了文檔..但作爲一個相對'noob'我沒有comletely理解它:/ –