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

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

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

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


person ashes    schedule 19.07.2013    source источник
comment
Не могли бы Вы резюмировать этот вопрос в одном предложении?   -  person jaczes    schedule 19.07.2013
comment
Как написать предварительное условие для проверки наличия в столбце ненулевого ограничения?   -  person ashes    schedule 20.07.2013


Ответы (2)


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

    <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>
    
person Yury Kisliak    schedule 28.04.2015
comment
ОП пометил этот mySQL. Было бы гораздо полезнее предоставить такой синтаксис, чем отвечать на два разных вопроса. - person nomistic; 29.04.2015
comment
Добавлен запрос для mySQL. - person Yury Kisliak; 29.04.2015

Пересматриваю мой ответ. Liquibase поддерживает операцию добавить ненулевое ограничение следующим образом:

<changeSet author="me" id="example-001">
    <addNotNullConstraint 
        tableName="mytable"    
        columnName="mycol"
        columnDataType="VARCHAR(10)"
        defaultNullValue="NULL"/>
</changeSet>

Это автоматически обрабатывает столбцы, которые являются нулевыми, в моем примере заполняя их текстовой строкой «NULL».

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

person Mark O'Connor    schedule 19.07.2013
comment
Спасибо, но я бы не хотел делать сценарий миграции, заполняющий все нулевые элементы строкой. - person ashes; 20.07.2013
comment
@ashes Он заполняется строкой только в том случае, если столбец имеет строковый тип (MySQL заставляет вас указывать тип столбца при выполнении оператора MODIFY COLUMN). Что вы планируете делать с предварительным условием? В случае наличия столбцов со значениями NULL вы наверняка захотите указать значение по умолчанию. Это намного лучше по сравнению с тем, чтобы не менять тип столбца и оставлять схему в несогласованном состоянии. - person Mark O'Connor; 22.07.2013