1.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。
2.
可以使用触发器来进行审计跟踪,把修改记录到另外一张表中。
MySQL 不允许在触发器中使用 CALL 语句 ,也就是不能调用存储过程。
BEGIN
和 END
当触发器的触发条件满足时,将会执行 BEGIN
和 END
之间的触发器执行动作。
3.
注意:在 MySQL 中,分号 ;
是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL 可以开始执行了。因此,解释器遇到触发器执行动作中的分号后就开始执行,然后会报错,因为没有找到和 BEGIN 匹配的 END。
这时就会用到 DELIMITER
命令(DELIMITER 是定界符,分隔符的意思)。它是一条命令,不需要语句结束标识,语法为:DELIMITER new_delemiter
。new_delemiter
可以设为 1 个或多个长度的符号,默认的是分号 ;
,我们可以把它修改为其他符号,如 $
- DELIMITER $
。在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了 $
,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。
4.
CREATE TRIGGER
指令用于创建触发器。
语法:
CREATE TRIGGER trigger_name
trigger_time
trigger_event
ON table_name
FOR EACH ROW
BEGIN
trigger_statements
END;
说明:
-
trigger_name:触发器名
-
trigger_time: 触发器的触发时机。取值为
BEFORE
或AFTER
。 -
trigger_event: 触发器的监听事件。取值为
INSERT
、UPDATE
或DELETE
。 -
table_name: 触发器的监听目标。指定在哪张表上建立触发器。
-
FOR EACH ROW: 行级监视,Mysql 固定写法,其他 DBMS 不同。
-
trigger_statements: 触发器执行动作。是一条或多条 SQL 语句的列表,列表内的每条语句都必须用分号
;
来结尾。
示例:
DELIMITER $
CREATE TRIGGER `trigger_insert_user`
AFTER INSERT ON `user`
FOR EACH ROW
BEGIN
INSERT INTO `user_history`(user_id, operate_type, operate_time)
VALUES (NEW.id, 'add a user', now());
END $
DELIMITER ;
查看触发器
SHOW TRIGGERS;
删除触发器
DROP TRIGGER IF EXISTS trigger_insert_user;