MySQL/MariaDB触发器详解(2)

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表。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/39b076b79e713552f2630fdae0eeb68a.html