建立觸發程式
要建立觸發程式,請使用 SQL Developer 圖形介面或 DDL 陳述式 CREATE TRIGGER。
本節顯示如何使用這兩種方法來建立觸發器。
依照預設,觸發程式在建立時的狀態為啟用。若要建立處於停用狀態的觸發程式,請使用 CREATE TRIGGER 敘述句搭配 DISABLE 子句。
備註:若要建立觸發程式,您必須具有適當的權限;不過,對於此討論,您不需要此額外資訊。
注意:若要執行本文件中的教學課程,您必須以 SQL Developer 的使用者 HR 身分連線到 Oracle Database。
另請參閱:
-
Oracle Database PL/SQL Language Reference,瞭解有關 CREATE TRIGGER 敘述句的詳細資訊
關於 OLD 和 NEW 虛擬記錄
當列階層觸發器觸發時,PL/SQL 執行時期系統會建立並植入兩個虛擬記錄 OLD 與 NEW。它們叫做虛擬記錄的原因是,它們具有部分而非所有的記錄特性。
對於觸發程式正在處理的資料列:
-
若為 INSERT 觸發程式,OLD 不包含值,而 NEW 則包含新值。
-
若為 UPDATE 觸發器,OLD 會包含舊值,而 NEW 則包含新值。
-
若為 DELETE 觸發程式,OLD 會包含舊值,而 NEW 則不包含任何值。
若要參照虛擬記錄,請在其名稱前面加上冒號 -:OLD 或 :NEW- 如範例 6-1 。
另請參閱:Oracle Database PL/SQL Language Reference,瞭解有關 OLD 和 NEW 虛擬記錄的詳細資訊
教學課程:建立記錄表格變更的觸發程式
本教學課程示範如何使用 CREATE TRIGGER 陳述式建立觸發器 EVAL_CHANGE_TRIGGER,每當 INSERT、UPDATE 或 DELETE 陳述式變更 EVALUATIONS 表時,都會將列新增至表格 EVALUATIONS_LOG。
觸發條件會在觸發敘述句執行之後新增資料列,並使用條件式述詞 INSERTING 、 UPDATING 以及 DELETING 來決定觸發條件所觸發之三個可能的 DML 敘述句中的哪一個。
EVAL_CHANGE_TRIGGER 是陳述式階層觸發器與 AFTER 觸發器。
建立 EVALUATIONS_LOG 和 EVAL_CHANGE_TRIGGER:
-
建立 EVALUATIONS_LOG 表:
CREATE TABLE EVALUATIONS_LOG ( log_date DATE , action VARCHAR2(50)); -
建立 EVAL_CHANGE_TRIGGER:
CREATE OR REPLACE TRIGGER EVAL_CHANGE_TRIGGER AFTER INSERT OR UPDATE OR DELETE ON EVALUATIONS DECLARE log_action EVALUATIONS_LOG.action%TYPE; BEGIN IF INSERTING THEN log_action := 'Insert'; ELSIF UPDATING THEN log_action := 'Update'; ELSIF DELETING THEN log_action := 'Delete'; ELSE DBMS_OUTPUT.PUT_LINE('This code is not reachable.'); END IF; INSERT INTO EVALUATIONS_LOG (log_date, action) VALUES (SYSDATE, log_action); END;
另請參閱:Oracle Database PL/SQL Language Reference,瞭解有關條件述詞的詳細資訊
教學課程:建立一個在插入資料列之前,針對該資料列產生主索引鍵的觸發程式
本教學課程顯示如何使用「SQL Developer 建立觸發程式」工具,建立在資料列插入 EVALUATIONS 表格之前觸發的觸發程式,並使用 EVALUATIONS_SEQUENCE 產生該資料列之主索引鍵的唯一編號。
順序 EVALUATIONS_SEQUENCE (建立於教學課程:建立順序中) 會產生 EVALUATIONS 表格的主索引鍵 (建立於中)。不過,這些主索引鍵不會自動插入表格。
本教學課程顯示如何使用「SQL Developer 建立觸發器」工具來建立名為 NEW_EVALUATION_TRIGGER 的觸發器,此觸發器會在資料列插入 EVALUATIONS 表格之前觸發,並使用 EVALUATIONS_SEQUENCE 產生該資料列主索引鍵的唯一編號。每一列受到觸發 INSERT 陳述式影響,觸發器就會觸發一次。
NEW_EVALUATION_TRIGGER 是列階層觸發器,也是 BEFORE 觸發器。
建立 NEW_EVALUATION 觸發程式的步驟:
-
在「連線」框架中,展開 hr_conn 。
-
在綱要物件類型清單中,在觸發程式上按一下滑鼠右鍵。
-
在選項清單中,選取新建觸發程式。
-
在「建立觸發程式」視窗:
-
在「名稱」欄位中,在預設值 TRIGGER1 上輸入
NEW_EVALUATION_TRIGGER。 -
若為「基礎物件」,請從功能表中選取 EVALUATIONS 。
-
將 INSERT 從「可用事件」移至「選取的事件」。
(選取 INSERT 並選取 > 。)
-
取消選取敘述句層次選項。
-
選取確定。
會開啟 NEW_EVALUATION_TRIGGER 窗格,其中顯示建立觸發條件的 CREATE TRIGGER 敘述句:
CREATE OR REPLACE TRIGGER NEW_EVALUATION_TRIGGER BEFORE INSERT ON EVALUATIONS FOR EACH ROW BEGIN NULL; END;NEW_EVALUATION_TRIGGER 窗格的標題為斜體字型,表示尚未將觸發程式儲存在資料庫中。
-
-
在 CREATE TRIGGER 陳述式中,將 NULL 取代為下列文字:
:NEW.evaluation_id := evaluations_sequence.NEXTVAL -
從「檔案」功能表中選取儲存。
在 Oracle 資料庫編譯程序並儲存它之後,字體為 NEW_EVALUATION_TRIGGER 窗格的標題,不再是斜體字。
建立 INSTEAD OF 觸發程式
視觀表以表格方式呈現查詢的輸出。如果您想要變更表格的方式來變更檢視,則必須建立「啟動」觸發程式。這些觸發程式不會變更視觀表,而是變更基礎表格。
例如,假設檢視 EMP_LOCATIONS,其 NAME 資料欄是從 EMPLOYEES 表格的 LAST_NAME 與 FIRST_NAME 資料欄所建立:
CREATE VIEW EMP_LOCATIONS AS
SELECT e.EMPLOYEE_ID,
e.LAST_NAME || ', ' || e.FIRST_NAME NAME,
d.DEPARTMENT_NAME DEPARTMENT,
l.CITY CITY,
c.COUNTRY_NAME COUNTRY
FROM EMPLOYEES e, DEPARTMENTS d, LOCATIONS l, COUNTRIES c
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND
d.LOCATION_ID = l.LOCATION_ID AND
l.COUNTRY_ID = c.COUNTRY_ID
ORDER BY LAST_NAME;
若要更新檢視 EMP_LOCATIONS.NAME (建立於「使用 CREATE VIEW 敘述句建立檢視」中),您必須更新 EMPLOYEES.LAST_NAME 與 EMPLOYEES.FIRST_NAME。這是範例 6-1 中的 INSTEAD OF 觸發程式功能。
NEW 和 OLD 是 PL/SQL 程式實際執行引擎在資料列層次觸發條件觸發時所建立和填入的虛擬記錄。OLD 與 NEW 會分別儲存觸發器所處理之記錄的原始值與新值。它們叫做虛擬記錄的原因是,它們並不具有 PL/SQL 記錄的所有特性。
範例 6-1 建立 INSTEAD OF 觸發程式
CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE ON emp_locations
BEGIN
UPDATE employees SET
first_name = substr( :NEW.name, instr( :new.name, ',' )+2),
last_name = substr( :NEW.name, 1, instr( :new.name, ',')-1)
WHERE employee_id = :OLD.employee_id;
END;
另請參閱:
-
Oracle Database PL/SQL 語言參照,瞭解 INSTEAD OF 觸發程式的詳細資訊
-
Oracle Database PL/SQL 語言參考,瞭解有關 OLD 與 NEW 的詳細資訊
教學課程:建立記錄 LOGON 和 LOGOFF 事件的觸發程式
本教學課程顯示如何使用 CREATE TRIGGER 陳述式來建立兩個觸發器:HR_LOGON_TRIGGER 與 HR_LOGOFF_TRIGGER。在有人以使用者 HR 身分登入後,HR_LOGON_TRIGGER 便會在表格 HR_USERS_LOG 增加一個資料列。在某人像使用者 HR 身分登出之前,HR_LOGOFF_TRIGGER 即在 HR_USERS_LOG 表格中新增一個資料列。
HR_LOGON_TRIGGER 與 HR_LOGOFF_TRIGGER 為系統觸發器。HR_LOGON_TRIGGER 是 AFTER 觸發器,HR_LOGOFF_TRIGGER 是 BEFORE 觸發器。
建立 HR_USERS_LOG、HR_LOGON_TRIGGER 及 HR_LOGOFF_TRIGGER 的步驟:
-
建立 HR_USERS_LOG 表:
CREATE TABLE hr_users_log ( user_name VARCHAR2(30), activity VARCHAR2(20), event_date DATE ); -
建立 HR_LOGON_TRIGGER:
CREATE OR REPLACE TRIGGER hr_logon_trigger AFTER LOGON ON HR.SCHEMA BEGIN INSERT INTO hr_users_log (user_name, activity, event_date) VALUES (USER, 'LOGON', SYSDATE); END; -
建立 HR_LOGOFF_TRIGGER:
CREATE OR REPLACE TRIGGER hr_logoff_trigger BEFORE LOGOFF ON HR.SCHEMA BEGIN INSERT INTO hr_users_log (user_name, activity, event_date) VALUES (USER, 'LOGOFF', SYSDATE); END;
另請參閱:Oracle Database PL/SQL Language Reference,瞭解有關系統觸發程式的詳細資訊