40、mysql数据库(触发器)


1、触发器说明:

使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询。


2、创建触发器语法:

(1)插入前:

CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW

BEGIN

...

END


扫描二维码关注公众号,回复: 9211795 查看本文章

(2)插入后:

CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW

BEGIN

...

END


(3)删除前:

CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW

BEGIN

...

END


(4)删除后:

CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW

BEGIN

...

END


(5)更新前:

CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW

BEGIN

...

END


(6)更新后:

CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW

BEGIN

...

END


3、示例:

(1)准备表:

CREATE TABLE cmd (

id INT PRIMARY KEY auto_increment,

USER CHAR (32),

priv CHAR (10),

cmd CHAR (64),

sub_time datetime,

/*提交时间*/

success enum('yes', 'no')

/*0代表执行失败*/

);


CREATE TABLE errlog (

id INT PRIMARY KEY auto_increment,

err_cmd CHAR (64),

err_time datetime

);


(2)创建触发器:

1)创建:

delimiter //

CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW

BEGIN

IF NEW.success = 'no' THEN

/*等值判断*/

INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time);

/*必须加分号*/

END IF;

/*必须加分号*/

END //

delimiter ;

2)说明:

在MySQL中每行命令都是用";"结尾,回车后自动执行。在存储过程中";"往往不代表指令结束,

马上运行。DELIMITER表示定界符,原本就是";"的意思,因此用这个命令转换一下";"为"//",

这样只有收到"//"才认为指令结束可以执行。


(3)往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志:

INSERT INTO cmd (

USER,

priv,

cmd,

sub_time,

success

)

VALUES

('lc','0755','ls -l /etc',NOW(),'yes'),

('lc','0755','cat /etc/passwd',NOW(),'no'),

('lc','0755','useradd xxx',NOW(),'no'),

('lc','0755','ps aux',NOW(),'yes');


(4)查询错误日志,发现有两条:

select * from errlog;


4、使用触发器:

触发器无法由用户直接调用,而是由于对表的【增/删/改】操作被动引发的。


5、删除触发器:

drop trigger tri_after_insert_cmd;


6、补充:mysql触发器NEW OLD用法详解:

(1)当使用insert语句的时候,如果原表中没有数据的话,那么对于插入数据后表来说新插

入的那条数据就是new,如图所示:


(2)当使用delete语句的时候,删除的那一条数据相对于删除数据后表的数据来说就是od,

如图所示:


(3)当使用update语句的时候,当修改原表数据的时候相对于修改数据后表的数据来说原

表中修改的那条数据就是old,而修改数据后表被修改的那条数据就是new,如图所示:


(4)说明:

对于INSERT语句,只有NEW是合法的。

对于DELETE语句,只有OLD是合法的。

对于UPDATE语句NEW和OLD单独或同时使用都是合法的。















猜你喜欢

转载自www.cnblogs.com/LiuChang-blog/p/12320637.html