暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

触发器使用示例解析

你挖坑我来埋雷 2019-10-22
471

在日常开发工作中,我们有时候处于业务的需要,有时候就要用到触发器,或者是在面试时,面试官会问及关于触发器的知识,接下来就讲解下触发器:

在工作中有的时候数据库数据会自动的进行变更,这时就可能是触发器的原因导致某个条件下触发了触发器脚本,导致数据变更,在排查问题的时候,就需要查看都有哪些触发器以及读懂相关的脚本。

查询当前数据库中已经存在的触发器任务脚本SQL show triggers

在执行了该指令以后,将会显示已经存在的触发器任务详细信息,详视下图

在通过上图中的statement中就是名称为trigger的触发器任务脚本。

下面小山羊就来针对触发器的相关特殊属性字段进行下剖解:

CREATE

    [DEFINER = { user | CURRENT_USER }]

TRIGGER trigger_name

trigger_time trigger_event

ON tbl_name FOR EACH ROW

  [trigger_order]

trigger_body


trigger_time: { BEFORE |AFTER }

 

trigger_event: { INSERT |UPDATE | DELETE }


trigger_order: { FOLLOWS |PRECEDES } other_trigger_name;

 

注释:

before 是在---之前执行,after是在---之后执行

 

trigger_event

1、INSERT型触发器:插入某一行时激活触发器,可能通过INSERT

LOAD DATA、REPLACE 语句触发(LOAD DAT语句用于将一个文件装入到一个数据表中,相当与一系列的INSERT操作);

  2、UPDATE型触发器:更改某一行时激活触发器,可能通过UPDATE语句触发;

  3、DELETE型触发器:删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发。

trigger_order是MySQL5.7之后的一个功能,用于定义多个触发器,使用follows(尾随)或precedes(在…之先)来选择触发器执行的先后顺序。

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句;

示例:创建一个触发器,当对某张表进行操作后,进行记录

create triggerinsertusertrigger after INSERT

 on user_tab for each ROW

insert

intoedit_log_tab(update_user,update_time)values('wuyuquan',NOW());

 

注释:该触发器的原理是:当有数据插入到user_tab表后,就插入数据至edit_log_tab表中记录

 

 

 

 

CREATE TRIGGER edit_usersAFTER UPDATE ON user_tab FOR EACH ROW INSERT INTO update_log_tab (date_time,update_ip)

VALUES

    (

       NOW(),

       (

           SELECT

              SUBSTRING_INDEX(HOST, ':', 1) AS ip

           FROM

              information_schema. PROCESSLIST

           GROUP BY

              ip

       )

    );

 

 

注释:创建触发器名为edit_users 当user_tab表数据被修改后,往表update_log_tab中插入对应的修改IP和时间;

 

 

创建执行多条任务的触发器

 

CREATE TRIGGER edit_users AFTER UPDATE ON user_tab FOR EACH ROW

BEGIN

insert intoedit_log_tab(update_time,update_user)values(now(),'89852');

INSERT INTO update_log_tab(date_time, update_ip)

VALUES

    (

       NOW(),

       (

           SELECT

              SUBSTRING_INDEX(HOST, ':', 1) AS ip

           FROM

              information_schema. PROCESSLIST

           GROUP BY

              ip

       )

    );

END

;

当表user_tab表数据被修改时,同时往edit_log_tab表和update_log_tab表插入数据;

 

 

NEW可读可写:

CREATE TRIGGER edit_users before UPDATE ON user_tab FOR EACH ROW

BEGIN

IF

    new.user_id='xiaoshanyang' THEN

insert into edit_log_tab(update_time,update_user)values(now(),'xiaoshanyang');

INSERT INTO update_log_tab(date_time, update_ip)

VALUES

    (

       NOW(),

       (

           SELECT

              SUBSTRING_INDEX(HOST, ':', 1) AS ip

           FROM

              information_schema. PROCESSLIST

           GROUP BY

              ip

       )

    );

elseif new.user_id='xiaoshanyang@31' THEN

    insert into edit_log_tab(update_time,update_user)values(now(),'xiaoshanyang@31');

INSERT INTO update_log_tab(date_time, update_ip)

VALUES

    (

       NOW(),

       (

           SELECT

              SUBSTRING_INDEX(HOST, ':', 1) AS ip

           FROM

              information_schema. PROCESSLIST

           GROUP BY

              ip

       )

    );

end if;

END

;

 

OLD只读:

CREATE TRIGGER edit_users before UPDATE ON user_tab FOR EACH ROW

BEGIN

IF

    old.user_id='wuyuquan' THEN

insert into edit_log_tab(update_time,update_user)values(now(),old.user_id);

INSERT INTO update_log_tab(date_time, update_ip)

VALUES

    (

       NOW(),

       (

           SELECT

              SUBSTRING_INDEX(HOST, ':', 1) AS ip

           FROM

              information_schema. PROCESSLIST

           GROUP BY

              ip

       )

    );

elseif old.user_id='wuyuquan@31' THEN

    insert into edit_log_tab(update_time,update_user)values(now(),old.user_id);

INSERT INTO update_log_tab(date_time, update_ip)

VALUES

    (

       NOW(),

       (

           SELECT

              SUBSTRING_INDEX(HOST, ':', 1) AS ip

           FROM

              information_schema. PROCESSLIST

           GROUP BY

              ip

       )

    );

end if;

END;


文章转载自你挖坑我来埋雷,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论