概述
最近想实现一个监控mysql表的某个或者某几个字段值的变化,当监控字段的值发生变化时,将原有值和更新值保存下来。想实现这个功能受限想到的就是触发器,mysql的触发器块很久没碰过了,重新拎起来还是免不了查些资料什么的。花了点时间搞定了这个触发器。这里写个小例子来记录下mysql触发器编写的过程。
mysql触发器格式如下:
CREATE TRIGGER 触发器名 触发器时间 触发事件 ON 表名 FOR EACH ROW BEGIN 执行语句 END
注:触发器名 - 触发器的名称
触发器时间 - 触发器触发的时机,值为 BEFORE或AFTER
触发器事件 - 引起触发器触发的事件,值为INSERT或UPDATE或DELETE
表名 - 触发触发器的表名,即该触发器是建立在那张表上面的
执行语句 - 即为触发器出发后执行的操作
案例:监控表tp_temp的mobile字段,当mobile字段发生变化时,tp_temp_2建立更新记录 : 将更新前的mobile值和更新后的mobile值记录到tp_temp_2表的mobile1和mobile2中
tp_temp_1表:
CREATE TABLE `tp_temp_1` (
`p_id` varchar(40) DEFAULT NULL COMMENT 'ID',
`name` varchar(50) DEFAULT NULL COMMENT '姓名',
`sex` char(1) DEFAULT NULL COMMENT '性别(1:男,2:女)',
`mobile` varchar(12) DEFAULT NULL COMMENT '手机',
`addr` varchar(100) DEFAULT NULL COMMENT '地址'
)
tp_temp2表:
CREATE TABLE `tp_temp_2` (
`id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name1` varchar(50) DEFAULT NULL COMMENT 'old姓名',
`name2` varchar(50) DEFAULT NULL COMMENT 'new姓名',
`sex1` char(1) DEFAULT NULL COMMENT 'old性别',
`sex2` char(1) DEFAULT NULL COMMENT 'new性别',
`mobile1` varchar(12) DEFAULT NULL COMMENT 'old手机',
`mobile2` varchar(12) DEFAULT NULL COMMENT 'new手机',
`addr1` varchar(100) DEFAULT NULL COMMENT 'old地址',
`addr2` varchar(100) DEFAULT NULL COMMENT 'new地址',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
)
创建触发器trigger_test:
-- DELIMITER $$
-- CREATE
-- TRIGGER `mydb`.`trigger_test` BEFORE UPDATE -- mydb为数据库名
-- ON `mydb`.`tp_temp`
-- FOR EACH ROW BEGIN
-- SET @oldMobile = (SELECT c.mobile FROM tp_temp c WHERE c.list_id=new.list_id LIMIT 1);
-- IF new.mobile <> @oldMobile THEN
-- INSERT INTO tp_temp2(list_id,mobile1,mobile2,create_time)VALUE (new.list_id,@oldMobile,new.mobile,SYSDATE());
-- END IF;
-- END$$
-- DELIMITER ;
DELIMITER $$
USE `krchain_db`$$
DROP TRIGGER /*!50032 IF EXISTS */ `trigger_tes01`$$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `trigger_tes01` AFTER INSERT ON `tp_temp_2`
FOR EACH ROW BEGIN
DECLARE v_str VARCHAR(255) CHARACTER SET utf8;
DECLARE v_str2 VARCHAR(255) CHARACTER SET utf8;
SELECT mobile INTO v_str FROM inserted;
SET v_str2 = 'java -jar d:socketTest1.jar ' + v_str;
-- exec master..xp_cmdshell v_str2;
exec master..xp_cmdshell 'bcp krchain_db..tp_temp_2 out d:tt.txt -c -t ,-U root -P 1qaz2wsx'
END;
$$
DELIMITER ;
以上。
转载于:https://www.cnblogs.com/big-xuzhou/p/10326398.html
最后
以上就是怕孤单绿茶为你收集整理的mysql 触发器-监控表字段更新的全部内容,希望文章能够帮你解决mysql 触发器-监控表字段更新所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复