zoukankan      html  css  js  c++  java
  • 知识点:Mysql 基本用法之触发器

     

    触发器

    使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为

    注意:没有查询

    一 、创建触发器

    触发器基础语法:

    # 插入前
    CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 插入后
    CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 删除前
    CREATE TRIGGER tri_before_delete_tb1 BEFORE DELETE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 删除后
    CREATE TRIGGER tri_after_delete_tb1 AFTER DELETE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 更新前
    CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END
    
    # 更新后
    CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
    BEGIN
        ...
    END

    触发器举例应用:

    #准备表
    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
    );
    
    #创建触发器
    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 ;
    
    
    #往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
    INSERT INTO cmd (
        USER,
        priv,
        cmd,
        sub_time,
        success
    )
    VALUES
        ('duoduo','0755','ls -l /etc',NOW(),'yes'),
        ('duoduo','0755','cat /etc/passwd',NOW(),'no'),
        ('duoduo','0755','useradd xxx',NOW(),'no'),
        ('duoduo','0755','ps aux',NOW(),'yes');
    
    
    #查询错误日志,发现有两条
    mysql> select * from errlog;
    +----+-----------------+---------------------+
    | id | err_cmd         | err_time            |
    +----+-----------------+---------------------+
    |  1 | cat /etc/passwd | 2017-09-14 22:18:48 |
    |  2 | useradd xxx     | 2017-09-14 22:18:48 |
    +----+-----------------+---------------------+
    2 rows in set (0.00 sec)

    特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

     

    二、使用触发器

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

     

    三、 删除触发器

    删除语法:

    drop trigger tri_after_insert_cmd;

    附:Mysql 基本用法

    一、【Mysql 基本用法之视图

    二、【Mysql 基本用法之触发器

    三、【Mysql 基本用法之事务

    四、【Mysql 基本用法之存储过程

    五、【Mysql 基本用法之函数

    六、【Mysql 基本用法之流程控制

  • 相关阅读:
    stm32 复位后 引起引脚的变化,输出电平引起的问题
    利用jink的驱动软件j-flash 合并两个hex的方法,bootloader+app
    利用jink调试程序,时间不准的解决办法
    为什么你有10年经验,但成不了专家?
    第二章 信息的表示和处理
    Python人名独特性统计

    Python基本统计值计算
    VScode如何编译多个.C文件
    Python连续质数计算
  • 原文地址:https://www.cnblogs.com/yizhiamumu/p/9101730.html
Copyright © 2011-2022 走看看