1、触发器说明:
使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询。
2、创建触发器语法:
(1)插入前:
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN
...
END
(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单独或同时使用都是合法的。