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