1、背景
业务上有一张表记录仓库和经纬度的,正常情况不怎么做变更;业务反馈经常出现经纬度被更新的情况,操作人都是接口或者admin,人工运维后又会被接口/admin覆盖更新掉
2、过程
遇到这种情况,我的第一反应是定位代码更新语句的位置,对逻辑进行梳理改造,至少在更新的地方打个日志,出现数据异常变更时能够追溯一下,定位入口;
但是,梳理的过程发现,更新的地方比较多,而且项目用的是hibernate不是mybatis,更新的时候都是通用方法,定位难度很大;
业务着急修复,经纬度被覆盖更新会阻塞业务流程
3、解决
最终决定先用oracle的触发器,拦截非法的更新操作,思路就是当操作人不是指定人员的时候,将更新语句中的经纬度替换成原来的值,曲线救国,看似执行成功,实际值没有变
CREATE OR REPLACE TRIGGER base_location_update_trigger
BEFORE UPDATE ON base_location
FOR EACH ROW
BEGIN
IF (:NEW.last_operator not in ('lisi','zhangsan'))
THEN
:NEW.longitude := :Old.longitude;
:NEW.latitude := :Old.latitude;
END IF;
END;
4、过程的坑
1)最开始是当发现操作人不是zhangsan时,直接阻断
raise_application_error(-20001, ‘operator必须为张三’);
但是这样的话,代码调用的时候就会报错,导致后续流程无法流转;