關於觸發程式
觸發程式是儲存在資料庫中的 PL/SQL 單位,而且 (如果是啟用狀態) 會自動執行 (觸發) 以回應指定的事件。
觸發程式的結構如下:
TRIGGER trigger_name
triggering_event
[ trigger_restriction ]
BEGIN
triggered_action;
END;
綱要中觸發程式的 trigger_name 必須是唯一的。觸發程式的名稱可以與綱要中別種物件 (例如表格) 的名稱相同;不過,Oracle 建議使用可避免混淆的命名慣例。
如果觸發條件為 enabled 狀態,則如果 trigger_restriction 為 TRUE 或省略,觸發條件 _event 會讓資料庫執行 triggered_action。triggering_event 與表格、視圖、綱要或資料庫相關聯,而且是下列其中一項:
-
DML 陳述式 (說明於「關於資料處理語言 (DML) 陳述式」)
-
DDL 敘述句 (說明於「關於資料定義語言 (DDL) 敘述句」)
-
資料庫作業 (SERVERERROR、LOGON、LOGOFF、STARTUP 或 SHUTDOWN)
如果觸發程式為 disabled 狀態,就算 trigger_restriction 為 TRUE 或被省略,觸發程式也不會讓資料庫執行 triggered_action。
依照預設,觸發程式在建立時的狀態為啟用。您可以停用已啟用的觸發程式,也可以啟用已停用的觸發程式。
觸發程式和子程式不同,它是無法直接呼叫的。觸發程式只能由觸發事件呼叫,觸發事件則可以由任何的使用者或應用程式引發。除非觸發程式引發未能適當處理的錯誤,否則您可能會不知道觸發程式正在執行。
簡單觸發程式只能在下列其中一個計時點觸發:
-
在執行觸發事件之前 ( 陳述式層次 BEFORE 觸發程式 )
-
執行觸發事件之後 ( 對帳單層次 AFTER 觸發程式 )
-
事件影響的每個資料列之前 ( 資料列層次 BEFORE 觸發程式 )
-
在事件影響到每個資料列之後 ( 資料列層次 AFTER 觸發程式 )
複合觸發器可以在多個時間點觸發。如需複合觸發器的相關資訊,請參閱 Oracle Database PL/SQL Language Reference。
INSTEAD OF 觸發器是在檢視中定義,而其觸發事件為 DML 敘述句。Oracle Database 不執行 DML 敘述句,而是執行 INSTEAD OF 觸發程式。如需詳細資訊,請參閱建立 INSTEAD OF 觸發程式。
系統觸發程式定義在綱要或資料庫上。定義於綱要的觸發程式會針對與綱要擁有者 (目前擁有者) 相關聯的每個事件執行之。定義於資料庫的觸發程式會針對與所有擁有者相關聯的每個事件執行之。
觸發程式的用途之一就是強制執行套用至所有從屬端應用程式的商業規則。例如,假設新增至 EMPLOYEES 表格的資料必須具有特定格式,且許多用戶端應用程式可以將資料新增至此表格。此表格上的觸發程式可以確保,新增至表格的所有資料都具有適當的格式。因為每當任何從屬端新增資料至此表格時就會執行觸發程式,沒有任何從屬端可以規避這些規則,而強制執行規則的程式碼只能在觸發程式中儲存及維護,而非每一個從屬端應用程式。有關觸發程式的其他用途,請參閱 Oracle Database PL/SQL Language Reference。
另請參閱:Oracle Database PL/SQL Language Reference,瞭解觸發程式的完整資訊