我有一个数据库升级脚本来删除列上的非空约束。我想做一个前置条件检查,并且ALTER TABLE
只在它非空时调用。
master.xml 脚本是一个渐进的脚本,我不断添加脚本,并且每次都运行整个脚本。在我的 Alter Table 脚本第一次运行后,我不希望它再次运行。
无法为此找到预定义的前提条件,也无法编写 sqlcheck。
我有一个数据库升级脚本来删除列上的非空约束。我想做一个前置条件检查,并且ALTER TABLE
只在它非空时调用。
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>
对于甲骨文:
<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>
修改我的答案。Liquibase 支持add not null 约束操作,如下所示:
<changeSet author="me" id="example-001">
<addNotNullConstraint
tableName="mytable"
columnName="mycol"
columnDataType="VARCHAR(10)"
defaultNullValue="NULL"/>
</changeSet>
这会自动处理为空的列,在我的示例中使用文本字符串“NULL”填充它们。
我不认为这个变更集需要先决条件。在最坏的情况下,您将重新应用现有的列约束一次。Liquibase 跟踪所有变更集并确保它们不会再次执行。
对于 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>