手机网站的优势,个人网站空间,设计手机网站建设,建设个人网站用到的技术文章目录 1.触发器的概念2.触发器操作的语法结构3.各类触发器的典型应用案例3.1.需求描述以及实现思路3.2.创建日志表3.3.INSERT类型的触发器3.4.UPDATE类型的触发器3.5.DELETE类型的触发器 1.触发器的概念
触发器是与表中数据相关的数据库对象#xff0c;当表中的数据产生in… 文章目录 1.触发器的概念2.触发器操作的语法结构3.各类触发器的典型应用案例3.1.需求描述以及实现思路3.2.创建日志表3.3.INSERT类型的触发器3.4.UPDATE类型的触发器3.5.DELETE类型的触发器 1.触发器的概念
触发器是与表中数据相关的数据库对象当表中的数据产生inster、update、delete这类操作时可以通过触发器在这些动作之前或者之后去完成相应的操作例如向表中插入一条数据插入数据之后通过触发器完成一些操作。
在触发器中会定义很多的SQL语句集合当满足执行触发器的动作后会执行触发器中的SQL语句。
触发器可以协助应用程序在数据库端确保数据的完整性、日志记录、数据校验等各种操作触发器的最典型案例就是记录表中数据的操作日志例如当增加一条数据时就执行触发器中的逻辑记录本次插入的数据内容到一张日志表中当表中数据被修改后就通过触发器在日志表中记录数据修改前后的内容即使有误删除的情况下也可以通过日志表快速恢复数据同时也可以记录用户的行为。 可以使用触发器做一个类似回收站的功能当产生DELETE语句时将原数据写入到另外一张表这张表就是回收站。 在触发器中有两类别名用来引用触发器中发生变化后的记录内容
OLD记录触发器发生变化前的数据内容也就是旧的数据内容。 例如我们对update操作设置了触发器old会记录触发器发生变化前后的数据内容通过old就可以引用update修改之前的数据内容。 NEW记录触发器发生变化后的数据内容也就是新数据内容。 例如update的触发器通过old会引用update之前的数据内容同理通过new就可以引用update之后的数据内容。
常见的触发器类型
INSERT类型触发器 在INSERT类型的触发器中我们可以通过NEW别名来引用新增加的数据内容。 UPDATE类型触发器 在UPDATE类型的触发器中我们可以通过OLD引用数据修改前的内容通过NEW来引用数据修改后的内容。 DELETE类型触发器 在DELEET类型的触发器中我们可以通过OLD来引用被删除的数据内容。
MySQL只支持行级触发器。
2.触发器操作的语法结构
创建触发器
CREATE TRIGGER 触发器名称
BEFORE/AFTER INSERT/UPDATE/DELETE #BEFORE数据变动之前 AFTER数据变动之后 INSERT/UPDATE/DELETE表示触发器类型
ON 要对那张表设置触发器 FOR EACH ROW #行级触发器
BEGINSQL语句
END查看触发器
SHOW TRIGGERS删除
DROP TRIGGER 触发器名称3.各类触发器的典型应用案例
3.1.需求描述以及实现思路
通过触发器去监控xscjb表针对表中数据的增删改三类操作将变更的内容以日志的形式记录到xscjb_logs表中。
我们要针对表中数据的增删改三类都要进行日志记录那么需要分别对这三类的操作定义一个触发器。 实现思路 首先定义一张xscjb_logs表用于记录xscjb表的增删改变更内容。然后分别对增删改三种操作定义触发器触发器的执行要在增删改之后再执行。最后在触发器中定义SQL语句通过insert语句将表数据变更前后的内容写入到日志表中数据变更前的内容可以通过old.字段的方式获取数据变更后的内容可以通过new.字段的方式获取。 插入数据的触发器只需要通过new别名来记录新数据的内容日志即可。 更新数据的触发器需要通过old记录更新前的数据内容也要通过new记录更新后的数据内容都写入到日志表。 删除数据的触发器只需要通过old来记录数据删除前的内容即可。 3.2.创建日志表
在日志表中可以定义这些字段
1操作类型记录该条日志是针对什么类型的操作触发的如insert。
2操作时间记录数据变动的执行时间
3发生变动的数据在原表的主键内容记录变动的数据在原表的主键字段的内容。
4日志内容记录数据变动前后的内容。
create table xscjb_logs(id int not null auto_increment,oper_type varchar(10) not null comment 操作类型,oper_time datetime not null comment 操作时间,data_id int not null comment 变动的数据在原表的主键id,oper_log varchar(500) comment 数据变动前后的内容,primary key (id)
) 3.3.INSERT类型的触发器
先来定义一个数据插入的触发器当表中有数据插入时通过INSERT类型的触发器将插入的数据记录在日志表中。
1创建触发器
create trigger xscjb_trigger_insert
after insert on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,insert,now(),new.xh,concat(插入的数据内容为xh,new.xh,,xm,new.xm,,ywcj,new.ywcj,,sxcj,new.sxcj,,yycj,new.yycj));
end;2触发器每条语句的含义
create trigger xscjb_trigger_insert
after insert on xscjb for each row #after表示数据变动之后执行触发器insert表示是插入类型的触发器当表中数据插入完成后再执行触发器针对xscjb的触发器
begin#整个触发器中只有一条SQL那就是将变动的数据插入到日志表中insert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) #为日志表中每一个字段都写入内容values (null, #id字段不用写id字段是主键并且自增无需填写内容insert, #操作类型字段填写insert即可表示这是INSTER触发器产生的日志now(), #操作时间字段可以通过now函数自动填写当前的日期时间new.xh, #data_id字段要记录数据在原表的主键字段值数据变动之后的内容都记录在new别名中当然也可以使用old但是insert语句没有old别名因此我们可以通过引用new别名指定的字段来读取数据变动后该字段的内容将读取到的主键内容写入到data_id字段concat(插入的数据内容为xh,new.xh,,xm,new.xm,,ywcj,new.ywcj,,sxcj,new.sxcj,,yycj,new.yycj)#操作日志字段主要记录数据变动前后的内容由于是inster类型的触发器只记录数据变动后新增的内容作为日志内容即可通过concat字符串拼接函数将内容形成一段话然后将变动的每个字段值通过new别名进行引用就可以拿到数据变动后的新内容);
end;3向xscjb表写入数据观察日志表是否有数据产生
为了更加直观可以写入多条数据。
insert into xscjb values (NULL,小江,88,77,66);当xscjb这张表有数据插入那么日志表就会通过触发器产生对应的inster日志在data_id字段可以看到那条数据发生了数据变动在oper_log字段可以看到具体的数据变更动作和变更的数据内容。 3.4.UPDATE类型的触发器
INSTER类型的触发器定义完毕了当有数据产生时就会将产生的数据内容和动作记录在日志表里下面来定义UPDATE类型的触发器当有数据发生了变化就将数据更新的前后内容都记录在日志表中。
1创建触发器
create trigger xscjb_trigger_update
after update on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,update,now(),old.xh,concat(更新前的数据内容xh,old.xh,,xm,old.xm,,ywcj,old.ywcj,,sxcj,old.sxcj,,yycj,old.yycj, 更新后的数据内容xh,new.xh,,xm,new.xm,,ywcj,new.ywcj,,sxcj,new.sxcj,,yycj,new.yycj));
end;2触发器每条语句的含义
触发器和INSERT类型的触发器语法结构一样只不过改了几个关键字对日志的内容增加了更加详细的内容。
create trigger xscjb_trigger_update
after update on xscjb for each row #update类型的触发器要将第二个关键字设置为update
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,update, #操作类型改为updatenow(),old.xh, #这里要记录原始数据的主键值由于是update类型面向的是旧数据因此通过old别名获取数据的主键值concat(更新前的数据内容xh,old.xh,,xm,old.xm,,ywcj,old.ywcj,,sxcj,old.sxcj,,yycj,old.yycj, 更新后的数据内容xh,new.xh,,xm,new.xm,,ywcj,new.ywcj,,sxcj,new.sxcj,,yycj,new.yycj)#update语句会通过old别名记录更新前的数据通过new记录更后的数据为了方便查看我们可以在操作日志中记录update更数据前后的数据内容更新前通过old别名引用获取指定字段的数据更新后通过new别名引用获取指定字段的数据);
end;3更新xscjb表中的数据观察日志表
update xscjb set ywcj 100 where xm 小黑;当xscjb表的数据发生更改时xscjb_trigger_update触发器就会向日志表中写入一条数据记录数据更新前后的内容。 3.5.DELETE类型的触发器
最后我们再来定义一个DELETE类型的触发器当表中数据删除后在日志表中记录被删除的数据内容。
1创建触发器
create trigger xscjb_trigger_delete
after delete on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,delete, now(),old.xh,concat(删除的数据内容xh,old.xh,,xm,old.xm,,ywcj,old.ywcj,,sxcj,old.sxcj,,yycj,old.yycj));
end;2触发器每条语句的含义
create trigger xscjb_trigger_delete
after delete on xscjb for each row #delete类型的触发器要将第二个关键字设置为delete
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,delete, #操作类型改为deletenow(),old.xh, #这里要记录原始数据的主键值由于是delete类型面向的是旧数据因此通过old别名获取数据的主键值concat(删除的数据内容xh,old.xh,,xm,old.xm,,ywcj,old.ywcj,,sxcj,old.sxcj,,yycj,old.yycj)); #最后将日志内容稍加变动即可
end;3删除多条数据观察日志表的记录
delete from xscjb where xh 9;删除的条件是xh大于9的数据删除完成后在日志表中会记录被删除的数据。