数据库触发器详解(6)

来源:未知 责任编辑:责任编辑 发表时间:2014-05-20 18:34 点击:

 
2)   如果sql执行失败,直接goto跳到err位置,不会执行或许的after型触发器;
 
3)   如过after触发器执行失败,goto到err2位置,恢复执行过的操作,且在事务型的表上做标记。
 
另外,在使用复杂的sql时,由于有些复杂的sql是mysql自己定义的,所以存在不确定性,使用简单的sql比较可控。
 
4   Mysql触发器在数据库同步中的表现
 
4.1   触发器运行失败时,数据库同步会失败吗?
 
有同步关系如下dbA?dbB。初始时同步正常。
 
1)在dbB上建立触发器:
 
DELIMITER |
create trigger trigger_after_planinfo_update
after update
ON FC_Word.planinfo FOR EACH ROW
BEGIN
insert into FC_Output.abc (planid) values (New.planid);
END
|
 
2)在dbA上执行sql,执行成功;
 
mysql> update planinfo set showprob=200 where planid= 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
 
3)由于dbB上没有FC_Output.abc表,触发器会执行失败,这时,检查一下同步状态:
 
Slave_IO_Running: Yes
Slave_SQL_Running: NO
Last_Errno: 1146
Last_Error: Error 'Table 'FC_Output.abc' doesn't exist' on query. Default database: 'FC_Word'. Query: 'update planinfo set showprob=200 where planid= 1'
 
可以看到IO线程运行正常,sql线程运行失败,并提示触发器运行失败的错误信息。
 
回忆一下3.1和3.3所述部分,无论是before部分的触发器还是after类型的触发器,对于innodb引擎,当触发器执行失败时,相应sql也会执行失败,所以数据库同步也会失败。
 
4.2   创建、删除触发器写bin-log
 
创建和删除触发器的语句也会写入bin-log里,所以也会如一般的insert,update,delete语句一样同步到下游数据库中,即上游创建触发器,下游也会创建。
 
这里再引出两个小问题:有同步关系dbA?dbB,
 
1)   在dbA上创建一个触发器,如果dbB上已经有同表同类型的触发器,同步状态如何?
 
2)   在dbB上删除一个触发器,如果dbB上没有对应触发器,同步状态如何?
 
这两个问题可以类比同步中的insert语句和delete语句,答案就是
 
1)   同步失败,因为不允许重复创建同表同类型的触发器;
 
2)   同步正常,因为drop一个不存在的触发器,不影响运行结果;
 
5   Mysql触发器经典案例
 
5.1   案例1 一条sql涉及多个表的update时,触发得到update之前的旧值
 
【现象】表test_info上建有触发器如下:
 
CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER trig_test_info_update
AFTER UPDATE
ON FC_Word.test_info FOR EACH ROW
BEGIN
DECLARE tlevel INTEGER DEFAULT 0;
DECLARE ttype INTEGER DEFAULT 0;
SET tlevel = 4;
SET ttype = 33;
INSERT INTO TEST_Output.fcevent (te, le, uid, pid, uid, wid, bi, mbid, wl) SELECT ttype, tlevel, NEW.uid, NEW.pid, NEW.uid, NEW.wid, NEW.bi, NEW.mbid, wl FROM TEST_Word.wext2 where wid = NEW.wid;
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • mysql-mmm
  • mysqldump命令——MySQL数据库备份还原
  • Oracle数据导入MySQL的快捷工具:MySQL Migration Toolkit
  • 简简单单储存过程——循环一个select结果集
  • MySQL数据库十大优化技巧
  • Mysql安装笔记
  • Mysql主主复制架构配置
  • Mysql的Procedure 参数为NULL问题分析
  • MySQL Stmt预处理提高效率问题的小研究
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1