mysql 觸發器-監控表字段更新


  最近想實現一個監控mysql表的某個或者某幾個字段值的變化,當監控字段的值發生變化時,將原有值和更新值保存下來。想實現這個功能受限想到的就是觸發器,mysql的觸發器塊很久沒碰過了,重新拎起來還是免不了查些資料什么的。花了點時間搞定了這個觸發器。這里寫個小例子來記錄下mysql觸發器編寫的過程。

mysql觸發器格式如下:

CREATE TRIGGER 觸發器名 觸發器時間 觸發事件
ON 表名 FOR EACH ROW
BEGIN
    執行語句
END
注:觸發器名 - 觸發器的名稱
  觸發器時間 - 觸發器觸發的時機,值為 BEFOREAFTER
  觸發器事件 - 引起觸發器觸發的事件,值為INSERTUPDATEDELETE
  表名 - 觸發觸發器的表名,即該觸發器是建立在那張表上面的
  執行語句 - 即為觸發器出發后執行的操作

案例:監控表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 ;

 

以上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM