Preconditions は、変更ログ または 変更セット に含ませ、データベースの状態に基づいて、データベースへの変更を制御します。
preconditions タグを利用する主な理由はこちらです。
お望みであれば、ひとつの <changeSet> タグにひとつの precondition だけにすることもできます。
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.8 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.8.xsd"> <preConditions> <dbms type="oracle" /> <runningAs username="SYSTEM" /> </preConditions> <changeSet id="1" author="bob"> <preConditions onFail="WARN"> <sqlCheck expectedResult="0">select count(*) from oldtable</sqlCheck> </preConditions> <comment>Comments should go after preCondition. If they are before then liquibase usually gives error.</comment> <dropTable tableName="oldtable"/> </changeSet> </databaseChangeLog>
上記の変更ログは、データベースが Oracle に対して実行され、データベースユーザーが “SYSTEM” で実行されているときにだけ実行されます。また、”oldtable” が何の結果も含まない(レコード数が0の)時だけ、 テーブルの削除 を行います。
LiquiBase は、前提条件の “failures” ( failed のチェック) と、”errors” ( チェックの実施中にスローされた例外 ) を区別し、<preConditions> タグの、”onFail” と “onError” 属性を用いてそれぞれに対応します。 1.8 から
| HALT | すぐにすべての変更ログの実施を中断 [デフォルト] |
|---|---|
| CONTINUE | 変更セットを飛ばし、変更セットの実行は次回の更新で再実施され、変更ログを継続 |
| MARK_RAN | 変更セットを飛ばすが、それを実施されたことにして、変更ログを継続 |
| WARN | 警告メッセージを出力して、通常通りに変更セットを実施 |
条件付きロジックは、<and> , <or> と <not> タグをネストさせて利用することで対応できます。条件に関するタグが指定されない場合、デフォルトでは AND が利用されます。
例:
<preConditions> <dbms type="oracle" /> <runningAs username="SYSTEM" /> </preConditions>
これは、Oracle かつ SYSTEM ユーザーである必要があります。
<preConditions> <dbms type="oracle" /> <dbms type="mssql" /> </preConditions>
これは、Oracle かつ MS-SQL である必要がありますが、つねに false となります。巨大で予期しないマージのタスクがない限りにおいて。
<preConditions> <or> <dbms type="oracle" /> <dbms type="mssql" /> </or> </preConditions>
これは、Oracle または MS-SQL である必要があり、上記の例より、もっと意味のあるものです。
<preConditions> <or> <and> <dbms type="oracle" /> <runningAs username="SYSTEM" /> </and> <and> <dbms type="mssql" /> <runningAs username="sa" /> </and> </or> </preConditions>
これは、Oracle に対して 、かつ SYSTEM ユーザーで実行する組み合わせ、もしくは、MS-SQL に対して SA ユーザーで実行する組み合わせの場合に実行されます。
データベースの種類が対象と合致しているときに通過します。
| type | データベースの種類 [必須] |
|---|
データベースユーザーが username 属性で指定されたものと合致する場合に通過します。
| username | スクリプトが実行されるデータベースユーザー [必須] |
|---|
指定された変更セットがすでに実行されていた場合に通過します。1.8 から
| id | 変更セットの “id” [必須] |
|---|---|
| author | 変更セットの “author” [必須] |
| changeLogFile | 変更セットのファイル名 (相対クラスパスを含む) [必須] |
指定されたカラムがデータベースに存在していた場合に通過します。 1.8 から
| schemaName | テーブルのスキーマ名 [必須] |
|---|---|
| tableName | そのカラムを含むテーブル名 [必須] |
| columnName | カラム名 [必須] |
指定されたテーブルがすでにデータベースに存在していた場合に通過します。1.8 から
| schemaName | テーブルのスキーマ名 [必須] |
|---|---|
| tableName | テーブル名 [必須] |
指定されたビューがすでにデータベースに存在していた場合に通過します。1.8 から
| schemaName | ビューのスキーマ名 [必須] |
|---|---|
| viewName | ビュー名 [必須] |
指定された外部キーがすでにデータベースに存在していた場合に通過します。1.8 から
| schemaName | 外部キー制約のスキーマ名 [必須] |
|---|---|
| foreignKeyName | 外部キー制約名 [必須] |
指定されたインデックスがすでにデータベースに存在していた場合に通過します。1.8 から
| schemaName | インデックスのスキーマ名 [必須] |
|---|---|
| indexName | インデックス名 [必須] |
指定されたシーケンスがすでにデータベースに存在していた場合に通過します。1.8 から
| schemaName | シーケンスのスキーマ名 [必須] |
|---|---|
| sequenceName | シーケンス名 [必須] |
指定された主キーがすでにデータベースに存在していた場合に通過します。1.8 から
| schemaName | 主キー制約のスキーマ名 [必須] |
|---|---|
| primaryKeyName | 主キー制約名 [必須] |
SQL 文を実行し、戻り値をチェックします。SQL 文は1行の1つの値を戻すものでなければなりません。 行数を確認するには、”count” SQL 関数を使用します。値の範囲をチェックするには、SQL でチェックを実施し、容易に比較のできる値を返すようにします。
<sqlCheck expectedResult="1">SELECT COUNT(1) FROM pg_tables WHERE TABLENAME = 'myRequiredTable'</sqlCheck>
| expectedResult | SQL の結果と比較する値 [必須] |
|---|
あなた専用のカスタマイズされた前提条件を作成するには、liquibase.precondition.CustomPrecondition インターフェースを実装したクラスを作成し、customPrecondition タグ内の className パラメータで参照するだけです。
前提条件は、個々の変更ログが実施される最初にチェックされます。もし、”include” タグを利用しており、その子どもの変更ログに前提条件しかない場合、これらの前提条件は migrator がこのファイルに到達するまで実施されません。この動作は将来の動作で変わるかもしれませんから、この動作に依存しないようにしてください。