mysql 内置功能 触发器 实验

 

 

#准备表
命令表
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代表执行失败
);

 

priv 字段是权限

sucess enum 是命令执行成功与否

 

另外一张命令错误表 记录命令出错信息

err_cmd 命令命

err_time 命令的提交时间

CREATE TABLE errlog (
    id INT PRIMARY KEY auto_increment,
    err_cmd CHAR (64),
    err_time datetime
);

 

这两张表都有关系的

插入记录到cmd表 如果插入的命令记录有错误 这条错误的记录会插入到errlog表里

在插入完之后做触发器,判断这条命令是否错误 插完之后sueess字段如果为no,意味着这条命令记录是错误的,就把错误记录写入到,

errlog表里

 

 

#创建触发器
触发器提供两个对象

1.NEW 代表新增进来的记录

2. old 代表之前老的记录

insert 都是新的记录 都用new对象
alter 是用到老记录和新纪录 所以修改时候涉及用到old、new对象

new对象下面有相应的属性 new.id 就是调新建记录的id new.user 调新增记录的user
new.success



delimiter //  # 设置mysql结束语句符号为//
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) ; #必须加分号,这里加;也不会中断mysql语句
      END IF ; #必须加分号
END// # 结束触发器语句
delimiter ;  # 把mysql 结束语句符号 还原为;



上面的中间代码的语法类似于shell

判断这个new.success字段新增进来的记录是否为no 如果为no执行then 下面的代码

if new.success ='no' then

  执行的代码

end if ; 结束语句


mysql 结束语句符号都是;
delimiter
作用是声明sql语句的结束符号 用任意符号都可以

delimiter //  声明mysql结束语句符号 用// 不用;


#往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
)
VALUES
    ('egon','0755','ls -l /etc',NOW(),'yes'),
    ('egon','0755','cat /etc/passwd',NOW(),'no'),
    ('egon','0755','useradd xxx',NOW(),'no'),
    ('egon','0755','ps aux',NOW(),'yes');




插入后触发触发器

 

#查询错误日志,发现有两条
mysql> select * from errlog;
+----+-----------------+---------------------+
| id | err_cmd         | err_time            |
+----+-----------------+---------------------+
|  1 | cat /etc/passwd | 2018-11-12 05:28:46 |
|  2 | useradd xxx     | 2018-11-12 05:28:46 |
+----+-----------------+---------------------+
2 rows in set (0.00 sec)

 




posted @ 2018-11-13 18:11  minger_lcm  阅读(293)  评论(0编辑  收藏  举报