CREATE TRIGGER
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON
FOR EACH ROW
| 子句 | 說明 |
|---|---|
| Name | 最長 64 字元,建議 表名_事件縮寫 (如 t26_bu = BEFORE UPDATE) |
| Time | BEFORE (行變更前) / AFTER (行變更後) |
| Event | INSERT / UPDATE / DELETE |
| Table | 觸發器歸屬表,同一表同一事件同一時機只能建一個 |
| Granularity | FOR EACH ROW:逐行觸發(目前唯一支援模式) |
| Statement | 觸發執行體,可含復合語句、流程控制、變量、異常處理 |
觸發器體內禁止:DDL (CREATE/ALTER/DROP)、事務控制 (COMMIT/ROLLBACK/SAVEPOINT)、鎖表、權限變更、SELECT FROM table 等。允許:流程控制 (IF/CASE/LOOP)、變量 (DECLARE/SET)、條件/異常聲明。
目前需 ROOT 權限 或極高特權建立觸發器。未來版本將引入獨立 `CREATE TRIGGER` 權限:
GRANT CREATE TRIGGER ON table_name TO user_list;
REVOKE CREATE TRIGGER ON table_name FROM user_list;
CREATE TRIGGER users_bi BEFORE INSERT ON users
FOR EACH ROW
BEGIN
IF NEW.email NOT LIKE '%@%.%' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid email format';
END IF;
SET NEW.created_at = NOW();
END;
CREATE TRIGGER orders_ad AFTER DELETE ON orders
FOR EACH ROW
INSERT INTO audit_log (table_name, action, old_data, changed_at)
VALUES ('orders', 'DELETE', CONCAT('id=', OLD.id), NOW());