MySQL触发器 触发程序 详解及实例

MySQL触发程序--触发器(TRIGGER)详解及实例
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。Mysql5之后开始支持触发器,并且在创建触发器后会自动在/var/lib/mysql目录下生成TRG以及TRN文件(Linux下)你必须拥有足够的权限才能创建触发器(CREATE TRIGGER),如果你已经是root用户,那么就足够了。这跟SQL的标准有所不同。

MySQL触发器 触发程序语句代码在线生成

基本语法:

CREATE TRIGGER <触发器名称>   //触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.

trigger_time触发程序的动作时间:
{ BEFORE | AFTER }   //触发器有执行的时间设置:可以设置为事件发生前或后。

trigger_event激活触发程序的语句的类型
{ INSERT | UPDATE | DELETE }   //同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。

ON <表名称>   //触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。

FOR EACH ROW   //触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。

<触发器SQL语句>   //触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。



MySQL命令行下创建触发程序,实例1:

DELIMITER //      #等同于DELIMITER $$

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW    #为什么创建触发器时使用 for each row 这是因为加上这句则触发事件就是行级的,那么对每一行有这个动作都要触发一次事件
  BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;  
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END //       #等同于END $$

DELIMITER ;    #其中delimiter告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。使用delimiter //,这样只有当//出现之后,mysql解释器才会执行这段语句。


实例2:

drop trigger pre_common_member_insert;   //如果触发器member_update存在则删除
delimiter |
create trigger pre_common_member_insert
after insert
on `membertest`.`pre_common_member`  //触发器执行的表
for each row
begin
INSERT INTO      //被触发的表`web`.`pre_common_member`(`uid`,`email`,`username`,`password`,`status`,`emailstatus`,`avatarstatus`,`videophotostatus`,`adminid`,`groupid`,`groupexpiry`,`extgroupids`,`regdate`,`credits`,`notifysound`,`timeoffset`,`newpm`,`newprompt`,`accessmasks`,`allowadmincp`,`onlyacceptfriendpm`,`conisbind`) VALUES (new.uid,new.email,new.username,new.password,new.status,new.emailstatus,new.avatarstatus,new.videophotostatus,new.adminid,new.groupid,new.groupexpiry,new.extgroupids,new.regdate,new.credits,new.notifysound,new.timeoffset,new.newpm,new.newprompt,new.accessmasks,new.allowadmincp,new.onlyacceptfriendpm,new.conisbind);
end |
delimiter ;
解释:当membertest数据库库下的pre_common_member数据表更新,则触发该事件把数据同步更新到web数据库下pre_common_member表中。简单的说就是当membertest数据库库下的pre_common_member数据表更新则同步更新web数据库下pre_common_member表。


可以在mysql的命令行模式下创建触发器,也可以利用以下几款mysql管理软件创建,在这些软件中实现mysql触发器非常方便简单:
1、SQLyog (连接本机数据库成功后,我们可以在数据表上右击选择“Create Trigger…”或右键Triggers,选择Create Trigger…,这里不再过多赘述,适合windows系列系统)
2、Navicat(选择数据表--设计表--触发器,这里不再过多赘述,适合windows系列系统)
3、phpMyAdmin(版本有所差异,适合多系统)


MySQL触发器也存在一定的安全隐患,常见的有利用权限漏洞提权隐患:
1、上面提到的t.TRG文件可以看到是通过DEFINER来将触发器“绑定”到该触发器的创建用户上,并在执行时拥有该用户的权限。
2、利用mysql用户的file权限(文件读写权限),直接添加触发器TRG以及TRN文件,使其“绑定”到mysql默认管理员root@localhost用户上,触发器文件内容为提升mysql用户权限SQL语句。
3、利用之前发现的栈溢出漏洞来刷新服务器配置使得触发器文件可以被识别,并且在触发器执行时具有root@localhost的权限,以此来提升mysql用户权限。
预防措施:
1、由于该提权方式可以被远程利用,所以管理员应当关闭Mysql远程管理方式,只允许本地用户连接。
2、本着最小权限原则,应当为连接用户配置最小权限,不要分配all,file等高危权限。

MySQL触发器 触发程序语句代码在线生成
• 参考mysql官方文档:http://dev.mysql.com/doc/refman/5.1/zh/triggers.html

相关文章

此处评论已关闭