本版主题是 Oracle 目标端兼容性加固:修复小写表名同步到 Oracle 会建出「大写正常表 + 带引号小写孪生表」两份对象的问题,并补齐 Oracle 12c 自增列(IDENTITY)的版本适配与 11g 回退。达梦 / 崖山共用同一套方言,同样受益。
本次更新
修复:Oracle 表名大小写孪生对象
-
现象:MySQL / PostgreSQL 等小写命名的表同步到 Oracle 目标时,生成的 DDL 给表名、列名、schema 一律加双引号但不折叠大小写,Oracle 会把它建成带引号的小写对象,与无引号的常规大写表(
ORDERS)并存且互不冲突——目标库里出现两份同名(不同大小写)表,数据悄悄落进小写副本,已有大写表收不到数据 -
现在生成的 Oracle DDL 统一把无引号标识符折叠为大写后再引用(
"orders"→"ORDERS"),小写源表只建出一份常规大写对象,与手工预建的大写表正确汇合;schema 手填值同步规范化 -
目标表结构校验改按 Oracle 字典的大写口径匹配,消除「表已存在却被判定形状不符」的误报
修复 / 增强:Oracle 自增列(IDENTITY)全链路
-
自动识别目标版本:启动时探测目标库大版本。12c 及以上用原生
GENERATED BY DEFAULT ON NULL AS IDENTITY;11g 目标自动回退为 SEQUENCE + BEFORE INSERT 触发器模拟自增(此前 11g 目标建表直接失败)。版本门控只对真 Oracle 生效,达梦版本号虽为 8 但支持 IDENTITY,不受影响 -
源端自增识别补齐:除 JDBC 的 IS_AUTOINCREMENT 外,新增
ALL_TAB_IDENTITY_COLS字典兜底,并从ALL_TRIGGERS的 BEFORE INSERT 触发器体识别「序列 NEXTVAL 填入 :NEW.列」这一经典 11g 自增写法——此前 11g 源库的序列+触发器自增列同步到目标端会静默退化为普通列;审计类触发器(只写更新时间/更新人)不会被误判 -
结构变更保留自增:ALTER 修改列类型时不再把 IDENTITY 属性丢掉(此前只有新增列带自增,改列会静默降级)
-
全量后推进序列:初次全量用显式 ID 装数,新装的 identity/序列仍停在 1,此后业务侧省略 ID 的插入会主键冲突(ORA-00001);现在全量成功后自动把生成器推进到
MAX(ID)+1(best-effort,失败只告警不阻断同步) -
ALWAYS 目标表提前拦截:目标表自增列若是
GENERATED ALWAYS AS IDENTITY,显式插入 ID 会逐行撞 ORA-32795;现在同步前直接给出可操作的报错(改为 BY DEFAULT ON NULL 或删表重建),不再跑到数据阶段才失败
测试
-
新增 20 个单元测试,全量 1116 测试通过
-
新增 Oracle 23ai 真实容器端到端集成测试:小写源只产生一个大写对象且数据正确落位、全量后序列推进可真实生成下一个 ID、11g 序列+触发器 DDL 在真实服务器上可执行可识别、ALWAYS 目标表预检生效
升级
替换 jar 重启即可,表结构随 ddl-auto: update 自动演进;升级前备份 ./data。停机期间源库变更重启后自动补齐。
注意:此前版本若已在 Oracle 目标建出带引号的小写孪生表,升级后同步会写入常规大写表;小写副本不会被自动删除(删除对象属高危操作),确认数据无误后请手工 DROP。