DML 操作报列不存在?
背景概述
客户在测试时发现执行某些 DML 语句时,出现了异常情况,报表不存在或者列不匹配的情况;
我在做数据迁移测试的时候也出现此问题,迁移数据时报 unknow column;
看到这种情况的时候很奇怪,查看表结构时也能看到当前执行的 SQL 语句涉及的表及列是存在的;
经过排查,最终发现当前这张表涉及触发器,报错的也不是这张表,而是其他表。
问题复现
本次测试基于 GreatSQL 8.0.32
1.创建测试表
复制代码
2.创建触发器
复制代码
可以看到在创建触发器的时候,不会去判断语句中涉及的表或者列是否存在。
3.执行测试 SQL
复制代码
此时报错 c1 列不存在,但没有显示是具体那张表的 c1 列,因此对我们产生误导,明明 t1 表存在 c1 列,但是还是报错 c1 列不存在;
4.故障排查
遇到上述问题时,我们可以打开通用日志,观察一下日志中记录的语句
复制代码
可以看到当我们执行了 INSERT INTO test.t1 语句后紧接着自动执行 INSERT INTO t2(c1) 语句,因为 t2 表没有 c1 列,所以报错 Unknown column 'c1'。
5.查看当前表涉及的触发器
复制代码
当出现上面的问题时,可以查看一下这张表是否涉及触发器;如果涉及则检查一下对应触发器的 ACTION_STATEMENT 字段中的 SQL 语句涉及的表是否包含报错的字段。
总结
如果出现在执行 DML 操作时报错,并且报错跟当前表没有什么关系时可以考虑是否有触发器与当前表有关联,检查一下触发器中涉及的 SQL 语句.
版权声明: 本文为 InfoQ 作者【GreatSQL】的原创文章。
原文链接:【http://xie.infoq.cn/article/f9905f026ed84d52ecb83799c】。文章转载请联系作者。
评论