• 40、mysql数据库(触发器)



    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单独或同时使用都是合法的。















  • 相关阅读:
    获取 鼠标 键盘 最后响应信息
    EF 6 for mysql
    Python中的OS模块。
    python中的随机函数random的用法示例random
    Python中OSI七层模型
    Pythoon中的面向对象三大特征
    Python中的函数(学习日记)
    Python的6种运算符(日记)
    计算机的发展史
    osi七层
  • 原文地址:https://www.cnblogs.com/LiuChang-blog/p/12320637.html
Copyright © 2020-2023  润新知