before insert触发器的作用是:当向表emp中insert数据时,将首先激活该触发器,该触发器首先会将待插入数据填充到new表中,再向审核表audit中插入一行数据,并标明此次触发操作是"before insert"。触发器执行结束后,才开始向emp表中插入数据。
after insert触发器的作用是:当向表emp中insert数据时,将先将数据填充到new表中,再插入到emp表,之后激活该触发器,该触发器会向审核表audit中插入一行数据,并标明此次触发操作是"after insert"。
现在向emp表中插入数据进行测试。
INSERT INTO emp VALUES(10,3,'longshuai');
插入之后,查看audit表。
MariaDB [test]> select * from audit;
+----+---------------+--------+--------+-----------+
| id | note | emp_no | mgr_no | emp_name |
+----+---------------+--------+--------+-----------+
| 1 | before insert | 10 | 3 | longshuai |
| 2 | after insert | 10 | 3 | longshuai |
+----+---------------+--------+--------+-----------+
可以看到,一次insert操作触发了before insert和after insert两个触发器。且无论是before还是after insert触发器都有new表的存在。
在mariadb 10.2.3版本之后,一个表中可以为同一时间、同一事件创建多个触发器(在mysql中不允许)。例如:
# 创建第二个after insert触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo3
AFTER INSERT ON test.emp FOR EACH ROW
BEGIN
INSERT INTO audit VALUES(null,'after insert2',new.emp_no,new.mgr_no,new.emp_name);
END$$
DELIMITER ;
show triggers;
此处删除新建的这个trigger,注意删除trigger的时候是通过数据库名称来也引用trigger的,而不是table名称。
drop trigger test.trig_demo3;
3.delete触发器delete触发器的作用是:当删除表中数据记录的时候,将会激活触发器。
有两类insert触发器:before和after触发器,分别表示表中记录被删除之前和表中数据被删除之后激活触发器。
注意,delete触发器只在表中记录被删除的时候才会被激活。例如delete语句、replace语句。但是drop语句、truncate语句不会激活delete触发器,因为它们是DDL语句,而MySQL/MariaDB不支持DDL触发器,它们并没有对表中的记录执行delete操作。
# 创建before delete触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo3
BEFORE DELETE ON test.emp FOR EACH ROW
BEGIN
INSERT INTO audit VALUES(NULL,'before delete',old.emp_no,old.mgr_no,old.emp_name);
END$$
DELIMITER ;
# 创建after delete触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo4
AFTER DELETE ON test.emp FOR EACH ROW
BEGIN
INSERT INTO audit VALUES(NULL,'after delete',old.emp_no,old.mgr_no,old.emp_name);
END$$
DELIMITER ;
这两个delete事件的触发器作用很简单,先将待删除的记录插入到old表中,再在删除表中的记录之前、之后,向审核表audit中插入一行'before delete'或'after delete'的审核日志。
现在删除emp表中的一行记录进行测试。
delete from emp where emp_no=10;
删除emp表中数据之后,查看audit表。
MariaDB [test]> SELECT * FROM audit;
+----+---------------+--------+--------+-----------+
| id | note | emp_no | mgr_no | emp_name |
+----+---------------+--------+--------+-----------+
| 1 | before insert | 10 | 3 | longshuai |
| 2 | after insert | 10 | 3 | longshuai |
| 3 | before delete | 0 | NULL | NULL |
| 4 | after delete | 0 | NULL | NULL |
+----+---------------+--------+--------+-----------+
可见,一次delete操作触发了before delete和after delete触发器。且删除记录前后old表都存在。
4.update触发器update触发器的作用是:当表中数据记录被修改的时候,将会激活触发器。
有两类update触发器:before和after触发器,分别表示表中记录被修改之前和表中数据被修改之后激活触发器。
注意,update操作可以认为是先delete再insert,因此它将填充old表和new表。