PL/SQL - 觸發器:數據庫自動化的友好指南
你好啊,未來的數據庫魔法師們!今天,我們將進入PL/SQL 觸發器的神奇世界。別擔心你對編程還是新手——我會成為你這次冒險中的可靠嚮導。在本教程結束時,你將能夠像專業人士一樣創建觸發器!
觸發器到底是什麼?
想像你是一名圖書管理員(請跟著我想像)。每次有書被借出去時,你需要更新日誌、檢查是否逾期,並可能向借書人發送提醒。對於每本書都這樣手動操作會非常累人!這就是觸發器的用處。
在數據庫世界中,觸發器就像是自動執行特定操作的幫手小精靈。它們是對特定數據庫操作做出反應的代碼片段。
創建觸發器:讓我們動手吧!
現在,讓我們創建第一個觸發器。我們從簡單的開始,然後逐步進階。
基本觸發器結構
以下是觸發器的一般結構:
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
[FOR EACH ROW]
[WHEN condition]
DECLARE
-- 變量聲明
BEGIN
-- 觸發器體
EXCEPTION
-- 異常處理
END;
/
別被這個嚇到了!我們會一步步解析。
範例 1:一個簡單的 "Hello, World!" 觸發器
讓我們創建一個在表中新行插入時說 "Hello, World!" 的觸發器:
CREATE OR REPLACE TRIGGER hello_world_trigger
AFTER INSERT ON employees
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, World! 一位新員工被添加了!');
END;
/
這裡發生了什麼?
-
CREATE OR REPLACE TRIGGER
:這告訴數據庫我們正在創建一個新的觸發器(或者替換一個現有的)。 -
AFTER INSERT ON employees
:我們的觸發器將在 'employees' 表中插入新行後觸發。 -
BEGIN...END
:這是我們放置觸發器邏輯的地方。 -
DBMS_OUTPUT.PUT_LINE
:這只是一種打印文字的時髦方式。
範例 2:記錄變更
讓我們創建一個記錄 'employees' 表變更的有用觸發器:
CREATE OR REPLACE TRIGGER log_salary_changes
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
INSERT INTO salary_change_log (employee_id, old_salary, new_salary, change_date)
VALUES (:OLD.employee_id, :OLD.salary, :NEW.salary, SYSDATE);
END;
/
這裡有什麼新東西?
-
AFTER UPDATE OF salary
:這個觸發器只有在 'salary' 欄位被更新時才會觸發。 -
FOR EACH ROW
:這意味著對於 UPDATE 影響的每一行,觸發器都會被觸發。 -
:OLD
和:NEW
:這些指的是更新行的舊值和新值。
觸發觸發器:讓魔法發生
現在,我們已經創建了觸發器,那麼我們如何讓它們被觸發呢?簡單!通過執行它們正在監視的數據庫操作。
範例 3:觸發我們的觸發器
讓我們看看我們的觸發器在行動:
-- 這將觸發我們的 'hello_world_trigger'
INSERT INTO employees (employee_id, name, salary)
VALUES (1, 'John Doe', 50000);
-- 這將觸發我們的 'log_salary_changes' 觸發器
UPDATE employees
SET salary = 55000
WHERE employee_id = 1;
當你運行這些命令時,在背後,我們的觸發器會 spring into action( spring into action 沒有直譯,這裡保持原文以保留原文的語氣和細微差別)!
觸發器類型:便捷的表格
以下是不同類型觸發器的快速參考表格:
觸發器類型 | 描述 | 範例使用案例 |
---|---|---|
BEFORE | 在觸發動作之前觸發 | 验證或修改輸入數據,在它被插入之前 |
AFTER | 在觸發動作之後觸發 | 記錄變更或更新相關表 |
INSERT | 在 INSERT 操 |
Credits: Image by storyset