Oracle数据库中Liquibase addCheckConstraint约束ENUM列失效问题
解决Liquibase检查约束未生效的问题
嘿,我一眼就发现了问题的关键——你的Liquibase变更日志里表名不匹配!
你看:
- 你用
createTable创建的表是BOOKING - 但
addCheckConstraint里指定的表却是SOME_TABLE
这就导致检查约束被加到了错误的表上,而你实际需要约束的BOOKING表的STATUS_ENUM列根本没带上这个限制,自然能插入任意值啦。直接执行SQL时约束正常工作,是因为你SQL里指定的表是正确的(应该是BOOKING而非SOME_TABLE)。
修正步骤
- 修改你的YAML变更日志,把
addCheckConstraint中的tableName改成BOOKING,和创建表的名称保持一致:
- changeSet: id: 1565352995028-1 author: Zafrullah Syed changes: - createTable: columns: - column: constraints: primaryKey: true name: ID type: NUMBER(19, 0) - column: name: STATUS_ENUM type: VARCHAR2(10 CHAR) tableName: BOOKING - addCheckConstraint: constraintBody: STATUS_ENUM IN ('ERROR', 'CONFIRMED', 'QUEUED', 'REJECTED') constraintName: enumcheck tableName: BOOKING # 这里改成BOOKING
- 如果之前已经执行过错误的变更日志,你需要先清理掉错误加到
SOME_TABLE上的约束:
ALTER TABLE SOME_TABLE DROP CONSTRAINT enumcheck;
然后回滚之前的Liquibase变更,再重新执行修正后的变更日志即可。
这样修改后,BOOKING表的STATUS_ENUM列就会被正确限制为指定的枚举值,无法插入其他内容了。
内容的提问来源于stack exchange,提问作者Zafrullah Syed
相关产品推荐
相关产品推荐

