技术开发 频道

MySQL存储过程和触发器使用释疑

  内部相关:

  6.我们可以通过下面方式查看一个库下面的所有触发器:

SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_STATEMENT
FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA='dbname';

  7.触发器的存储形式。

  目前触发器存放在.TRG文件中,每一个表中的触发器存储在一个TRG文件中,我们可以到表的数据目录下,看到这个文件,如:

[root@sunss test]# ls
a.frm a.MYD a.MYI a.TRG b.frm b.MYD b.MYI tai_a.TRN tau_a.TRN test.frm test.MYD test.MYI
[root@sunss test]# pwd
/home/mysql/test
[root@sunss test]# cat a.TRG
TYPE
=TRIGGERS
triggers
='CREATE DEFINER=`mysqldba`@`%` TRIGGER `tau_a` AFTER UPDATE ON `a` \n FOR EACH ROW BEGIN\n update b set cnt=NEW.cnt where id=NEW.id;\n END' 'CREATE DEFINER=`mysqldba`@`%` TRIGGER `tai_a` AFTER INSERT ON `a` \n FOR EACH ROW BEGIN\n insert into b values(NEW.id,NEW.cnt); \n END'
sql_modes
=0 0
definers
='mysqldba@%' 'mysqldba@%'
client_cs_names
='utf8' 'utf8'
connection_cl_names
='utf8_general_ci' 'utf8_general_ci'
db_cl_names
='utf8_general_ci' 'utf8_general_ci'
You have new mail
in /var/spool/mail/root
[root@sunss test]#

  8.触发器可以更新远程的表,但远程的表必须使用FEDERATED存储引擎。

  复制相关:

  9.触发器在MySQL复制环境中也是可以工作的。

  在MySQL5.0的版本和其他大多数数据库系统一样,触发器和复制都能工作。在主库上,通过触发器承载的操作,不会复制到从库上。但是,如果主库上存在的触发器,如果在从库上的相关表中也创建的话,在从库上的触发器就能和主库一样被激活、触发。

  10.在主库上的操作是怎样被复制到从库上去的?

  首先要确定一件事:主从库都有同样的触发器,在主库上创建的触发器也要在从库上重新创建一遍。这样DML语句在复制中就能在从库上激活触发器。例如:还是a表,我们在a表中创建了一个after insert 触发器,复制过程如下:

  1).一条insert语句插入a表。

  2).after insert 激活触发器,也插入到b表。

  3).insert语句写入到bin log中。

  4).复制线程获得并执行insert语句。

  5).after insert 激活触发器,也插入到b表。

0
相关文章