2010-09-05 67 views
9

有人能解釋oracle 10g中的「之前」和「之後」之間的區別嗎?在oracle中觸發之前和之後的區別

+0

我仍然不確定你在簡單的方面尋找什麼,所以我刪除了我的答案。其他人可能有一個好主意。 – 2010-09-05 13:12:05

+0

對於每個小小的疑問,我都會在堆棧溢出中發佈一個問題,而不會想到.....(我想我不應該這樣做)....我現在理解觸發器的概念。在我發佈這個問題之前,我會考慮... – Jagan 2010-09-05 13:18:13

回答

22

首先,我將通過定義觸發開始我的答案是:觸發是當行添加,修改或刪除時運行的存儲過程。

觸發器可以運行將採取行動或所採取的操作。

BEFORE觸發器通常用於在接受更改前進行驗證。它們在對數據庫進行任何更改之前運行。假設您爲銀行運行數據庫。你有一個表accounts和一個表transactions。如果用戶從他的賬戶中提款,那麼您需要確保用戶的賬戶中有足夠的餘額用於他的提款。如果accounts的餘額不足,則BEFORE觸發器將允許這樣做,並防止在transactions中插入該行。

AFTER觸發器通常用於由於更改而需要在單獨的表中更新信息。它們在對數據庫進行更改後運行(不一定提交)。讓我們回到我們的後面的例子。成功交易後,您需要在accounts表中更新balance。一個AFTER觸發器將允許你做到這一點。

+1

+1我只是補充說一些觸發器驗證必須在AFTER行中執行觸發器,因爲只有在AFTER觸發器中列值是「固定的」。在BEFORE觸發器中,您可以驗證並通過一些基於以下值的複雜規則:NEW.col僅用於:NEW.col的值在觸發器中稍後進行更改,以便違反規則。 – 2011-08-10 09:58:46

6

我不完全確定你對什麼感興趣,所以我會保持這個基礎。

觸發器

  • 按名稱之前,這些觸發器之前在表中創建的行解僱。隨後,由於該行尚未創建,因此您可以完全訪問:new.table_element字段。如果嘗試插入/更新不需要/格式錯誤的數據,這可以實現數據清理和統一性。這只是一個基本的例子,但您需要在任何時候需要訪問「:new」數據時使用before觸發器。

觸發器

  • 由於後觸發閃光一次,該行已經創建,當你想發生是由於該行的邏輯這些觸發器通常使用後。例如,如果您有地址表並且用戶更新了他/她的地址,那麼您可能需要在創建時更新外部參照表中的地址引用ID(如果您恰好保留了所有舊地址)。此外,與前面的觸發器不同,您無權修改任何列值,因爲表中已存在該行。
1

BEFORE TRIGGER用於觸發動作應該確定是否允許觸發語句完成。通過使用BEFORE TRIGGERS用戶可以消除不必要的觸發語句處理 但是,在觸發語句後使用AFTER TRIGGERS應該在執行觸發器操作之前完成。

+0

請編輯您現有的答案,而不是重複另一個答案。 – wonea 2012-11-15 09:59:06

相關問題