I have a db upgrade script to remove the non-null constraint on a column. I want to do a precondition check, and call ALTER TABLE
only when it is non-null.
The master.xml script is a progressive one where I keep adding scripts and the entire thing runs everytime. After the first time my Alter Table script has run, I do not want it to be run again.
Couldn't find a predefined precondition for this, and could not write an sqlcheck either.
For 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>
Can be done with sqlCheck.
For 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>
For 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>
For 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>
Revising my answer. Liquibase supports an add not null constraint operation as follows:
<changeSet author="me" id="example-001">
<addNotNullConstraint
tableName="mytable"
columnName="mycol"
columnDataType="VARCHAR(10)"
defaultNullValue="NULL"/>
</changeSet>
This automatically handles columns that are null, in my example populating them with the text string "NULL".
I don't think this changeset requires a pre-condition. Worst case you'd re-apply the existing column constraint, once. Liquibase tracks all changsets and ensures they are not executed again.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With