Предварительные условия 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 отслеживает все изменения и гарантирует, что они не будут выполнены снова.