PL/SQL - 觸發器:數據庫自動化的友好指南

你好啊,未來的數據庫魔法師們!今天,我們將進入PL/SQL 觸發器的神奇世界。別擔心你對編程還是新手——我會成為你這次冒險中的可靠嚮導。在本教程結束時,你將能夠像專業人士一樣創建觸發器!

PL/SQL - Triggers

觸發器到底是什麼?

想像你是一名圖書管理員(請跟著我想像)。每次有書被借出去時,你需要更新日誌、檢查是否逾期,並可能向借書人發送提醒。對於每本書都這樣手動操作會非常累人!這就是觸發器的用處。

在數據庫世界中,觸發器就像是自動執行特定操作的幫手小精靈。它們是對特定數據庫操作做出反應的代碼片段。

創建觸發器:讓我們動手吧!

現在,讓我們創建第一個觸發器。我們從簡單的開始,然後逐步進階。

基本觸發器結構

以下是觸發器的一般結構:

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