• 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)
    
    


  • 相关阅读:
    高精度不会的迅速暴击此处
    高精度不会的迅速暴击此处
    codevs3243:区间翻转,线段树
    codevs3243:区间翻转,线段树
    codevs3243:区间翻转,线段树
    [NOIP2010]关押罪犯
    [NOIP2010]关押罪犯
    [NOIP2010]关押罪犯
    [UVALive 6693]Flow Game计算几何,线代相交
    2017 省赛选拨 火车入站 CSU 1757 模拟
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/9942833.html
Copyright © 2020-2023  润新知