数据库触发器详解(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;
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>