mysql数据库数据改变监控 触发器 游标 new. old. java监控比对 最终是在后端java进行比对
2016-06-24 11:22
387 查看
最近有了这样一个需求,就是数据改变项,需要进行突出显示,而这就涉及到一个数据比对的问题,在网上搜了一下解决方案,没有明确的方案,大致上也只有两种:
一种通过数据库来进行处理,暂时以mysql为例子
一种后台代码实现
先说一下数据库的思路,最后没有成功:
设计到数据的前后改变,我想大多数的朋友也都会想到是触发器trigger;另一种数据库的方式就是读取mysql的操作日志如
当然任何一款数据库均会有操作日志,比如oracle会进行数据的归档的日志等。
由于操作日志比较复杂,而且不容易读取操作,往往会有偏差,因此在这里说一下触发器的思路:
首先创建触发器,另外由于表的字段数有1000列,因此无法通过常规的new.column != old.column的常规思路去做,忒繁琐,估计要写到2020年,维护也比较繁琐,只能去考虑数据库字段的循环遍历,因此使用了mysql自由的这样一个表去做,sql如下
通过游标的形式进行字段的循环到一个变量中, 然后用new.variable,old.variable,这个时间报错,提示没有这个字段,也是正常的,然后就去找mysql是否有另外一种机制,比如相应的符号,来特殊的指定到变量上,当引用的时间,不是操作的变量,这样就可以进行循环遍历,可以最后愣是没有找到类似的解决方案,所以只能放弃,但愿有一天会可以使用。
再说一下后台代码实现:
后台代码相当于是一个两个model的比对,由于是一个常用的功能,我进行了功能的抽象,使用了主要的知识点是映射的概念,见如下代码:
最后会将不一致的列名进行一个返回,这样就可以进行业务的实际开发了,大体就是这个 样子
一种通过数据库来进行处理,暂时以mysql为例子
一种后台代码实现
先说一下数据库的思路,最后没有成功:
设计到数据的前后改变,我想大多数的朋友也都会想到是触发器trigger;另一种数据库的方式就是读取mysql的操作日志如
当然任何一款数据库均会有操作日志,比如oracle会进行数据的归档的日志等。
由于操作日志比较复杂,而且不容易读取操作,往往会有偏差,因此在这里说一下触发器的思路:
首先创建触发器,另外由于表的字段数有1000列,因此无法通过常规的new.column != old.column的常规思路去做,忒繁琐,估计要写到2020年,维护也比较繁琐,只能去考虑数据库字段的循环遍历,因此使用了mysql自由的这样一个表去做,sql如下
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_name = 'one';
通过游标的形式进行字段的循环到一个变量中, 然后用new.variable,old.variable,这个时间报错,提示没有这个字段,也是正常的,然后就去找mysql是否有另外一种机制,比如相应的符号,来特殊的指定到变量上,当引用的时间,不是操作的变量,这样就可以进行循环遍历,可以最后愣是没有找到类似的解决方案,所以只能放弃,但愿有一天会可以使用。
再说一下后台代码实现:
后台代码相当于是一个两个model的比对,由于是一个常用的功能,我进行了功能的抽象,使用了主要的知识点是映射的概念,见如下代码:
<pre name="code" class="java">public static List<String> getDisffField(Object o1, Object o2) throws InstantiationException, IllegalAccessException, IntrospectionException, IllegalArgumentException, InvocationTargetException { List<String> l = new ArrayList<String>(); Field fArr[] = o1.getClass().getDeclaredFields(); for(Field f : fArr) { String fieldName = f.getName(); PropertyDescriptor pd = new PropertyDescriptor(fieldName, o1.getClass()); Method getM = pd.getReadMethod(); Object fieldO1 = getM.invoke(o1); Object fieldO2 = getM.invoke(o2); if(!(fieldO1+"").equals(fieldO2+"")) { l.add(fieldName); } } return l; }
最后会将不一致的列名进行一个返回,这样就可以进行业务的实际开发了,大体就是这个 样子
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- Android之获取手机上的图片和视频缩略图thumbnails
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- SQL中的三值逻辑
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- 数据库链接字符串查询网站
- SQL Server 作业批量停止
- 结束SQL阻塞的进程