MySQL觸發(fā)器運(yùn)用于遷移和同步數(shù)據(jù)的實(shí)例教程
1.遷移數(shù)據(jù)
進(jìn)行數(shù)據(jù)庫(kù)移植,SQL Server=>MySQL。SQL Server上有如下的Trigger
SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO ALTER TRIGGER [trg_risks] ON dbo.projectrisk FOR INSERT, UPDATE AS BEGIN UPDATE projectrisk SET classification = case when calc>= 9 then 3 when calc <9 and calc>=4 then 2 when calc <4 then 1 end from (select inserted.id, inserted.possibility*inserted.severity as calc from inserted) as T1 where projectrisk.id = T1.id END GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
簡(jiǎn)單了解了下MySQL中,Trigger的語(yǔ)法。
# 創(chuàng)建 CREATE TRIGGER <觸發(fā)器名稱(chēng)> { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON <表名稱(chēng)> FOR EACH ROW <觸發(fā)器SQL語(yǔ)句> # 刪除 DROP TRIGGER <觸發(fā)器名稱(chēng)>
注:創(chuàng)建觸發(fā)器需要CREATE TRIGGER權(quán)限。(HeidiSQL中執(zhí)行Trigger語(yǔ)句會(huì)有bug)
由于MySQL中的每個(gè)觸發(fā)器只能針對(duì)一個(gè)動(dòng)作,所以本次移植就需要?jiǎng)?chuàng)建兩個(gè)觸發(fā)器。對(duì)于發(fā)生變更的行,在觸發(fā)器中可以用 NEW 來(lái)代替。
下邊的觸發(fā)器有什么問(wèn)題嗎?
delimiter && CREATE TRIGGER trg_risks_insert AFTER INSERT ON `projectrisk` FOR EACH ROW UPDATE projectrisk SET classification = CASE WHEN possibility*severity>=9 THEN 3 WHEN possibility*severity <9 AND possibility*severity>=4 THEN 2 WHEN possibility*severity <4 THEN 1 END WHERE id = new.id; && CREATE TRIGGER trg_risks_update AFTER UPDATE ON `projectrisk` FOR EACH ROW UPDATE projectrisk SET classification = CASE WHEN possibility*severity>=9 THEN 3 WHEN possibility*severity <9 AND possibility*severity>=4 THEN 2 WHEN possibility*severity <4 THEN 1 END WHERE id = new.id; && delimiter ;
問(wèn)題就是,沒(méi)有考慮到觸發(fā)器中的修改也會(huì)觸發(fā)觸發(fā)器,進(jìn)入了死循環(huán)。做了如下修改后,終于OK了。
delimiter && CREATE TRIGGER trg_risks_insert BEFORE INSERT ON `projectrisk` FOR EACH ROW BEGIN SET new.classification = CASE WHEN new.possibility*new.severity>=9 THEN 3 WHEN new.possibility*new.severity <9 AND new.possibility*new.severity>=4 THEN 2 WHEN new.possibility*new.severity <4 THEN 1 END; END && CREATE TRIGGER trg_risks_update BEFORE UPDATE ON `projectrisk` FOR EACH ROW BEGIN SET new.classification = CASE WHEN new.possibility*new.severity>=9 THEN 3 WHEN new.possibility*new.severity <9 AND new.possibility*new.severity>=4 THEN 2 WHEN new.possibility*new.severity <4 THEN 1 END; END && delimiter ;
2.同步備份數(shù)據(jù)記錄表
添加記錄到新記錄表
DELIMITER $$ USE `DB_Test`$$ CREATE /*!50017 DEFINER = 'root'@'%' */ TRIGGER `InsertOPM_Alarm_trigger` BEFORE INSERT ON `OPM_Alarm` FOR EACH ROW BEGIN INSERT INTO OPM_Alarm_copy (AlarmId,AlarmCode,AlarmTypeId,AlarmLevelId,AlarmObjectCode,AlarmStatus,AlarmHandleUser, AlarmHandleTime,ADDTIME,ParkUserId,BerthCode,BargainOrderCode,BerthStartTime) VALUES(new.AlarmId,new.AlarmCode,new.AlarmTypeId,new.AlarmLevelId,new.AlarmObjectCode,new.AlarmStatus,new.AlarmHandleUser, new.AlarmHandleTime,new.ADDTIME,new.ParkUserId,new.BerthCode,new.BargainOrderCode,new.BerthStartTime); END; $$ DELIMITER ; CREATE TRIGGER InsertOPM_Alarm_trigger BEFORE INSERT ON OPM_Alarm FOR EACH ROW BEGIN INSERT INTO OPM_Alarm_copy (AlarmId,AlarmCode,AlarmTypeId,AlarmLevelId,AlarmObjectCode,AlarmStatus,AlarmHandleUser, AlarmHandleTime,ADDTIME,ParkUserId,BerthCode,BargainOrderCode,BerthStartTime) VALUES(new.AlarmId,new.AlarmCode,new.AlarmTypeId,new.AlarmLevelId,new.AlarmObjectCode,new.AlarmStatus,new.AlarmHandleUser, new.AlarmHandleTime,new.ADDTIME,new.ParkUserId,new.BerthCode,new.BargainOrderCode,new.BerthStartTime); END ;
mysql觸發(fā)器監(jiān)控mysql數(shù)據(jù)表記錄刪除操作 DELIMITER $$
USE `DB_Test`$$ DROP TRIGGER /*!50032 IF EXISTS */ `SYS_OPM_trigger`$$ CREATE /*!50017 DEFINER = 'root'@'%' */ TRIGGER `SYS_OPM_trigger` AFTER DELETE ON `OPM_Alarm` FOR EACH ROW BEGIN DECLARE str VARCHAR(40000); SET str=CONCAT(old.AlarmId,'@',old.AlarmCode,'@',old.AlarmTypeId,'@',old.AlarmLevelId,'@', old.AlarmObjectCode,'@',old.AlarmStatus,'@',old.AlarmHandleUser,'@',old.AlarmHandleTime,'@', old.AddTime,'@',old.ParkUserId,'@',old.BerthCode,'@',old.BargainOrderCode,'@',old.BerthStartTime); INSERT INTO OPM_AlarmAction_log(UserName,Client_IP,Delete_before_key,Delete_Date) VALUES(SUBSTRING_INDEX(USER(),'@',1),SUBSTRING_INDEX(USER(),'@',-1), str, NOW()); END; $$ DELIMITER ;
刪除前 添加原記錄備份到另一記錄表
DELIMITER $$ USE `DB_Test`$$ DROP TRIGGER /*!50032 IF EXISTS */ `InsertOPM_Alarm_trigger`$$ CREATE /*!50017 DEFINER = 'root'@'%' */ TRIGGER `InsertOPM_Alarm_trigger` BEFORE DELETE ON `OPM_Alarm` FOR EACH ROW BEGIN INSERT INTO OPM_Alarm_copy (AlarmId,AlarmCode,AlarmTypeId,AlarmLevelId,AlarmObjectCode,AlarmStatus,AlarmHandleUser, AlarmHandleTime,ADDTIME,ParkUserId,BerthCode,BargainOrderCode,BerthStartTime) VALUES (old.AlarmId,old.AlarmCode,old.AlarmTypeId,old.AlarmLevelId,old.AlarmObjectCode,old.AlarmS tatus,old.AlarmHandleUser, old.AlarmHandleTime,old.ADDTIME,old.ParkUserId,old.BerthCode,old.BargainOrderCode,old.Bert hStartTime); END; $$ DELIMITER ;
- MySQL觸發(fā)器的使用場(chǎng)景及方法實(shí)例
- mysql觸發(fā)器原理與用法實(shí)例分析
- mysql觸發(fā)器之創(chuàng)建多個(gè)觸發(fā)器操作實(shí)例分析
- MySQL 觸發(fā)器定義與用法簡(jiǎn)單實(shí)例
- mysql 觸發(fā)器用法實(shí)例詳解
- MySQL通過(guò)觸發(fā)器解決數(shù)據(jù)庫(kù)中表的行數(shù)限制詳解及實(shí)例
- MySQL 觸發(fā)器詳解及簡(jiǎn)單實(shí)例
- mysql觸發(fā)器(Trigger)簡(jiǎn)明總結(jié)和使用實(shí)例
- MySQL中觸發(fā)器入門(mén)簡(jiǎn)單實(shí)例與介紹
- mysql觸發(fā)器trigger實(shí)例詳解
相關(guān)文章
mysql 本地?cái)?shù)據(jù)庫(kù)如何從遠(yuǎn)程數(shù)據(jù)庫(kù)導(dǎo)數(shù)據(jù)
mysql 本地?cái)?shù)據(jù)庫(kù)如何從遠(yuǎn)程數(shù)據(jù)庫(kù)導(dǎo)數(shù)據(jù),本文以此問(wèn)題進(jìn)行詳細(xì)介紹,需要了解的朋友可以參考下2012-11-11MySQL中的全表掃描和索引樹(shù)掃描?的實(shí)例詳解
這篇文章主要介紹了MySQL中的全表掃描和索引樹(shù)掃描?,從本文的學(xué)習(xí)可以輕松的知道,全表掃描的效率相比于索引樹(shù)掃描相對(duì)較低一點(diǎn),但是差距不是很大,具體示例代碼詳解跟隨小編一起看看吧2022-05-05mysql創(chuàng)建表分區(qū)的實(shí)現(xiàn)示例
表分區(qū)是指根據(jù)一定規(guī)則,將數(shù)據(jù)庫(kù)中的一張表分解成多個(gè)更小的,容易管理的部分,本文主要介紹了mysql創(chuàng)建表分區(qū)的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-01-01詳解數(shù)據(jù)庫(kù)多表連接查詢的實(shí)現(xiàn)方法
這篇文章主要介紹了詳解數(shù)據(jù)庫(kù)多表連接查詢的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文大家能夠掌握數(shù)據(jù)庫(kù)多表查詢的方法,需要的朋友可以參考下2017-09-09對(duì)于mysql的query_cache認(rèn)識(shí)的誤區(qū)
一直以來(lái),對(duì)于mysql的query_cache,在網(wǎng)上就流行著這樣的說(shuō)法,對(duì)于mysql的query_cache鍵值就是mysql的query,所以,如果在query中有任何的不同,包括多了個(gè)空格,都會(huì)導(dǎo)致mysql認(rèn)為是不同的查詢2012-03-03