我有一个数据库升级脚本来删除列上的非null约束。我想做一个前置条件检查,并且只有当ALTER TABLE
为非null时才调用它。
master.xml脚本是一个渐进的脚本,我不断添加脚本,每次都会运行整个脚本。在我的Alter Table脚本第一次运行后,我不希望它再次运行。
找不到预定义的前提条件,也无法编写sqlcheck。
可以使用sqlCheck完成。
-
对于MySql
<preConditions onFail="MARK_RAN" onError="CONTINUE"> <sqlCheck expectedResult="NO"> SELECT is_Nullable FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='<table_name>' AND column_name='<column_name>' </sqlCheck> </preConditions>
-
对于Oracle:
<preConditions onFail="MARK_RAN" onError="CONTINUE"> <sqlCheck expectedResult="N"> SELECT Nullable FROM user_tab_columns WHERE table_name = '<table_name>' AND column_name = '<column_name>' </sqlCheck> </preConditions>
-
对于SQL Server:
<preConditions onFail="MARK_RAN" onError="CONTINUE"> <sqlCheck expectedResult="0"> SELECT is_nullable FROM sys.columns WHERE object_id = OBJECT_ID('<table_name>') AND name = '<column_name>' </sqlCheck> </preConditions>
对于PostgreSQL:
<preConditions onFail="MARK_RAN" onError="HALT">
<sqlCheck expectedResult="NO">
SELECT is_nullable FROM information_schema.columns
WHERE
table_schema = '<schema_name>'
AND table_name = '<table_name>'
AND column_name = '<column_name'
</sqlCheck>
</preConditions>
重新审视我的答案。Liquibase支持添加非空约束操作,如下所示:
<changeSet author="me" id="example-001">
<addNotNullConstraint
tableName="mytable"
columnName="mycol"
columnDataType="VARCHAR(10)"
defaultNullValue="NULL"/>
</changeSet>
这会自动处理为null的列,在我的示例中,用文本字符串"null"填充这些列。
我认为这个变更集不需要前置条件。在最坏的情况下,您将重新应用现有的列约束一次。Liquibase跟踪所有变更集,并确保它们不会再次执行。