Предварительные условия Liquibase: Как проверить, что столбец не обнуляется?

У меня есть сценарий обновления базы данных, чтобы удалить ненулевое ограничение для столбца. Я хочу сделать предварительную проверку и позвонить ALTER TABLE только когда оно не равно нулю.

Сценарий master.xml - это прогрессивный сценарий, в который я продолжаю добавлять сценарии, и все это выполняется каждый раз. После первого запуска сценария Alter Table я не хочу, чтобы он запускался снова.

Не удалось найти предопределенное предварительное условие для этого, а также не удалось написать sqlcheck.

3 ответа

Можно сделать с помощью 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".

Я не думаю, что этот набор изменений требует предварительных условий. В худшем случае вы бы повторно применили существующее ограничение столбца, один раз. Liquibase отслеживает все изменения и гарантирует, что они не будут выполнены снова.

Другие вопросы по тегам