检查唯一约束是否存在,并使用 liquibase 将其删除

Check if the unique constraint exists and drop it using liquibase

提问人:Loren 提问时间:10/26/2016 更新时间:8/10/2023 访问量:10944

问:

我有一个变更集,我最初检查唯一约束是否存在,然后如果存在,它将删除约束。

<changeSet author="loren"
               id="DROP_UNIQUE_CONSTRAINT_RULEPRIORITY_ORACLE_v1" dbms="oracle">
        <preConditions onFail="MARK_RAN">
            <sqlCheck expectedResult="1">
                SELECT COUNT(*)
                FROM USER_CONSTRAINTS
                WHERE CONSTRAINT_NAME='UC_RULES_PRIORITY'
            </sqlCheck>
        </preConditions>
        <dropUniqueConstraint constraintName="UC_RULES_PRIORITY"
                              schemaName="${main.schema}"
                              tableName="RULES"/>

</changeSet>

这样做的问题是它似乎没有通过先决条件。它总是说MARK_RAN意味着没有找到约束。反过来,约束永远不会被丢弃。

我尝试在我的数据库中执行 SELECT 语句,它返回 1。

这是正确的方法还是有替代解决方案?

SQL Oracle Liquibase

评论

1赞 10/26/2016
与当前用户不同吗?如果您在 where 子句中使用并包含所有者会怎样?${main.schema}all_constraints
0赞 Loren 10/26/2016
你指的是${main.schema}的这种用法吗?从 ${main.schema} 中选择 COUNT(*)。USER_CONSTRAINTS 其中 CONSTRAINT_NAME='UC_RULES_PRIORITY'
1赞 10/26/2016
不。替换为 .再说一遍:与您用于连接到 Oracle 的用户相同吗?user_constraintsall_constraints${main.schema}
1赞 Loren 10/26/2016
我以前all_constraints,现在有效了。谢谢。是的,${main.schema} 与我用于连接到 Oracle 的相同。
1赞 10/26/2016
如果确实与用户名相同,则其工作方式应与 相同。您在使用时是否将 作为条件?如果没有,则您可能已经检查了其他用户的约束。很可能与用户anme不同${main.schema}user_constraintsall_constraitnsownerwhereall_constraints${main.schema}

答:

0赞 serv-inc 7/10/2023 #1

总结一下评论:

<changeSet author="loren"
               id="DROP_UNIQUE_CONSTRAINT_RULEPRIORITY_ORACLE_v1" dbms="oracle">
        <preConditions onFail="MARK_RAN">
            <sqlCheck expectedResult="1">
                SELECT COUNT(*)
                FROM all_constraints
                WHERE CONSTRAINT_NAME='UC_RULES_PRIORITY'
                AND OWNER='${main.schema}'
            </sqlCheck>
        </preConditions>
        <dropUniqueConstraint constraintName="UC_RULES_PRIORITY"
                              schemaName="${main.schema}"
                              tableName="RULES"/>

</changeSet>

@Loren:请调整和/或发布您自己的答案。