Oracle Form处于查询模式仍向表插入数据 如何阻止重复值插入
异常产生原因
这类问题是表单类业务系统非常典型的逻辑漏判问题,核心诱因有4个:
- 保存操作的状态校验逻辑完全缺失:开发时仅给保存按钮绑定了插入T1表的程序单元,没有加表单状态分支判断——不管当前是查询模式、新增模式还是编辑模式,只要点击按钮就会直接执行插入逻辑,查询模式下的点击操作没有被拦截。
- 表单变更检测机制失效:正常逻辑下表单初始加载查询结果后,会标记为「无用户修改」状态,保存时检测到该状态就会跳过数据库写操作;但当前逻辑没有做变更标记判断,哪怕用户没改任何字段、表单里存的是已经入库的历史查询数据,程序也会把这组数据当成新提交的内容执行INSERT。
- 插入程序单元本身无前置校验:负责写T1表的程序单元没有做存在性判断,既不区分操作来源,也不校验待写入的数据是否已经在表中存在,接收到表单传参就直接执行插入语句。
- 数据库层无兜底拦截:T1表没有针对业务唯一标识设置唯一性约束,程序层逻辑漏判时,数据库无法从底层拒绝重复数据写入,最终导致脏数据落库。
重复插入问题的拦截方案
从前端交互、业务逻辑、数据库兜底三层做校验,就可以完全杜绝这类问题:
- 第一层:表单交互层拦截
- 给保存按钮加状态判断逻辑:仅当表单处于新增提交/编辑提交状态时才响应保存操作,查询模式下可以直接禁用保存按钮,或者点击后直接拦截不触发任何数据库操作,可同步提示「当前为查询模式,无需执行保存」。
- 加表单变更标记:表单初始加载(不管是加载空白新增页还是加载查询结果)时,初始化
is_modified = false的标记,只有用户对任意表单字段做了实际修改,才把标记置为true;保存逻辑执行前先判断该标记,为false时直接终止流程,不触发后续数据库操作。
- 第二层:业务逻辑层校验
在插入程序单元执行INSERT语句前,先拿待插入数据的业务唯一字段(比如单据号、业务主体+业务类型+业务日期这类能唯一标识一条业务记录的字段组合)作为查询条件,检索T1表中是否已经存在相同记录:如果存在就直接终止插入,返回重复提示;不存在才继续执行插入逻辑。 - 第三层:数据库层兜底
给T1表的业务唯一字段组合创建唯一索引/唯一约束,这是拦截重复数据的最后一道防线——哪怕前面两层逻辑因为版本迭代、bug等原因失效,数据库遇到重复值写入时会直接抛出唯一键冲突异常,从根本上阻止重复数据落库,不会产生脏数据。
内容的提问来源于stack exchange,提问作者Ravindra
相关产品推荐
相关产品推荐

