基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建触发器
更新时间:2024-08-02 09:57:24
您可以使用 CREATE TRIGGER 语句创建触发器。
创建触发器的用户需要具备以下权限:
触发器关联的表的
SELECT、INSERT、UPDATE、DELETE等权限。触发器权限,即
CREATE TRIGGER权限。触发器激活后要执行的语句的权限。
语法
创建触发器的 SQL 语法如下:
CREATE
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
参数说明
| 参数 | 含义 |
|---|---|
| trigger_name | 触发器名称。同一个数据库下触发器名称必须唯一。 |
| trigger_time | BEFORE 或 AFTER,BEFORE 是指在执行触发事件之前激活当前所创建的触发器;AFTER 是指在执行触发事件之后激活当前所创建的触发器。 |
| trigger_event | INSERT、UPDATE 或 DELETE 表示激活触发器的操作类型。 |
| table_name | 表示建立触发器的表名。 |
| trigger_body | 触发执行的代码主体。可以是单行语句,也可以是多行命令。如果是多行命令,需要写在 BEGIN ... END 之间。可以通过 OLD.columnName 访问将要或已经被修改的原数据,NEW.columnName 用来表示将要或已经修改后的新数据。LD.columnName 是只读的,而 NEW.columnName 则可以在触发器中使用 SET 赋值。 |
示例
在表 account 上创建触发器 trigger_account_insert,在执行插入数据时,同时向表 account_log 插入数据。
obclient> CREATE TABLE account(id INT, name VARCHAR(20));
Query OK, 0 rows affected
obclient> CREATE TABLE account_log(id INT, action VARCHAR(20));
Query OK, 0 rows affected
obclient> DELIMITER /
obclient> CREATE TRIGGER trigger_account_insert BEFORE INSERT ON account FOR EACH ROW
BEGIN
INSERT INTO account_log VALUES(NEW.id, 'ADD');
END;/
obclient> DELIMITER ;
obclient> SELECT * FROM information_schema.triggers WHERE trigger_name = 'trigger_account_insert'\G;
*************************** 1. row ***************************
TRIGGER_CATALOG: def
TRIGGER_SCHEMA: chz
TRIGGER_NAME: trigger_account_insert
EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: def
EVENT_OBJECT_SCHEMA: chz
EVENT_OBJECT_TABLE: account
ACTION_ORDER: 0
ACTION_CONDITION: NULL
ACTION_STATEMENT: TRIGGER trigger_account_insert BEFORE INSERT ON account FOR EACH ROW
BEGIN
INSERT INTO account_log VALUES(NEW.id, 'ADD');
END
ACTION_ORIENTATION: ROW
ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
ACTION_REFERENCE_OLD_ROW: OLD
ACTION_REFERENCE_NEW_ROW: NEW
CREATED: NULL
SQL_MODE: STRICT_ALL_TABLES,NO_ZERO_IN_DATE
DEFINER: 'chz'@'%'
CHARACTER_SET_CLIENT: utf8mb4
COLLATION_CONNECTION: utf8mb4
DATABASE_COLLATION: gbk
1 row in set
obclient> INSERT account VALUES(1, 'name1');
Query OK, 1 row affected
obclient> SELECT * from account_log;
+------+--------+
| id | action |
+------+--------+
| 1 | ADD |
+------+--------+
1 row in set
使用限制
MySQL 模式的触发器有以下使用限制:
对于同一个表,不能有多个触发器具备相同的触发事件和触发动作的时间。
只能在永久表上创建触发器,不能对临时表创建触发器。
触发器不能使用
CALL语句调用将数据返回给客户端或使用动态 SQL 的存储过程,但是允许存储过程或者函数通过OUT或者 INOUT类型的参数将数据返回触发器。触发器中不能使用开启或结束事务的语句段,例如,开始事务(
START TRANSACTION)、提交事务(COMMIT)或回滚事务(ROLLBACK),但是可以回滚到一个保存点,即 Savepoint 是允许的,因为回滚到保存点不会结束事务。外键不会激活触发器。
触发器中不允许返回值,因此触发器中不能有返回语句,如果需要立即停止一个触发器,则需要使用
LEAVE语句。