MySQL触发器运用于迁移和同步数据的实例教程

1.迁移数据
进行数据库移植,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

简单了解了下MySQL中,Trigger的语法。

# 创建
CREATE TRIGGER <触发器名称>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名称>
FOR EACH ROW
<触发器SQL语句> 

# 删除
DROP TRIGGER <触发器名称>

注:创建触发器需要CREATE TRIGGER权限。(HeidiSQL中执行Trigger语句会有bug)

由于MySQL中的每个触发器只能针对一个动作,所以本次移植就需要创建两个触发器。对于发生变更的行,在触发器中可以用 NEW 来代替。
下边的触发器有什么问题吗?

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 ;

问题就是,没有考虑到触发器中的修改也会触发触发器,进入了死循环。做了如下修改后,终于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.同步备份数据记录表
添加记录到新记录表

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触发器监控mysql数据表记录删除操作 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 ;
(0)

相关推荐

  • MySQL存储过程中的基本函数和触发器的相关学习教程

    MySQL存储过程的常用函数 一.字符串类 CHARSET(str) //返回字串字符集 CONCAT (string2 [,... ]) //连接字串 INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0 LCASE (string2 ) //转换成小写 LEFT (string2 ,length ) //从string2中的左边起取length个字符 LENGTH (string ) //string长度 LOAD_FI

  • MySQL中触发器的基础学习教程

    0.触发器的基本概念 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有以下的作用: (1).安全性.可以基于数据库的值使用户具有操作数据库的某种权利. # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据. # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%. (2).审计.可以跟踪用户对数据库的操作. # 审计用户操作数据库的语句. # 把用户对数

  • mysql 触发器实现两个表的数据同步

    mysql通过触发器实现两个表的同步 目前,在本地测试成功. 假设本地的两个数据库a和b,a下有表table1(id, val) b下有表table2(id, val) 假设希望当table1中数据更新,table2中数据同步更新. 代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ TRIGGER `a`.`触发器名` BEFORE UPDATE ON `a`.`table1` FOR EACH ROW BEGIN I

  • MySQL触发器运用于迁移和同步数据的实例教程

    1.迁移数据 进行数据库移植,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

  • Mysql将查询结果集转换为JSON数据的实例代码

    Mysql将查询结果集转换为JSON数据 前言学生表学生成绩表查询单个学生各科成绩(转换为对象JSON串并用逗号拼接)将单个学生各科成绩转换为数组JSON串将数组串作为value并设置key两张表联合查询(最终SQL,每个学生各科成绩)最终结果 前言 我们经常会有这样一种需求,一对关联关系表,一对多的关系,使用一条sql语句查询两张表的所有记录,例:一张学生表,一张学生各科成绩表,我们想要用一条SQL查询出每个学生各科成绩: 学生表 CREATE TABLE IF NOT EXISTS `stu

  • MySQL慢查询优化之慢查询日志分析的实例教程

    数据库响应慢问题最多的就是查询了.现在大部分数据库都提供了性能分析的帮助手段.例如Oracle中会帮你直接找出慢的语句,并且提供优化方案.在MySQL中就要自己开启慢日志记录加以分析(记录可以保存在表或者文件中,默认是保存在文件中,我们系统使用的就是默认方式). 先看看MySQL慢查询日志里面的记录长什么样的: Time Id Command Argument # Time: 141010 9:33:57 # User@Host: root[root] @ localhost [] Id: 1

  • SQL删除重复数据的实例教程

    目录 1 SQL去重 2 distinct 3 group by 1. 查询根据名字去重后数据(名字相同取id值大的) 2. 删除名字相同数据(名字相同保留id值大的) 4 总结 1 SQL去重 SQL中去除完全相同数据可以用distinct关键字,任意字段去重可以用group by,以下面的数据表为例. 2 distinct 存在两条完全相同的纪录,用关键字distinct就可以去掉 根据单个字段去重,能精确去重; 作用在多个字段时,只有当这几个字段的完全相同时,才能去重; 关键字distin

  • Ruby和Ruby on Rails中解析JSON格式数据的实例教程

    Ruby解析JSON Ruby解析Json例子: json = '["a", "B", "C"]' puts "Unsafe #{unsafe_json (json).inspect}" #输出Unsafe ["a", "B", "C"] Ruby解析Json把上面的json字符串解析成Array.这样的方法并不安全,比如: json = 'puts "Da

  • MYSQL跨服务器同步数据经验分享

    项目需要,自己找了些资料和亲手配置过后:得出的经验分享. (1)主服务器 修改配置文件/etc/my.cnf(my.ini) [mysqld] # mysql-bin是log文件的前缀,也可以使用其它的名字,比如服务器名 # 如果不带路径,会把log文件写到`/var/lib/mysql`下 log-bin=mysql-bin # serverid在一个同步体系中必须是唯一的,大于等于1且小于2^32-1的整数 server-id=1 binlog-do-db = 数据库名 (你要备份的数据库)

  • ktl工具实现mysql向mysql同步数据方法

    使用ktl工具实现mysql向mysql同步数据 1.新建作业步骤 2.完善作业步骤,主要是完成作业中的转换工作 3.首先要确定数据来源库,也就是数据输出库,这里是mysql 4.其次要确定数据接收库,这里也是mysql数据库 5.在作业中点击执行进行数据同步,根据数据量的不同同步时间也不一样. 6.数据同步完成后查看两个mysql数据库中同步的表数据,数据一致同步完成.

  • 用python简单实现mysql数据同步到ElasticSearch的教程

    之前博客有用logstash-input-jdbc同步mysql数据到ElasticSearch,但是由于同步时间最少是一分钟一次,无法满足线上业务,所以只能自己实现一个,但是时间比较紧,所以简单实现一个 思路: 网上有很多思路用什么mysql的binlog功能什么的,但是我对mysql了解实在有限,所以用一个很呆板的办法查询mysql得到数据,再插入es,因为数据量不大,而且10秒间隔同步一次,效率还可以,为了避免服务器之间的时间差和mysql更新和查询产生的时间差,所以在查询更新时间条件时是

  • python实现MySQL指定表增量同步数据到clickhouse的脚本

    python实现MySQL指定表增量同步数据到clickhouse,脚本如下: #!/usr/bin/env python3 # _*_ coding:utf8 _*_ from pymysqlreplication import BinLogStreamReader from pymysqlreplication.row_event import (DeleteRowsEvent,UpdateRowsEvent,WriteRowsEvent,) import clickhouse_driver

随机推荐