2016-05-19 2 views
0

、私はこのようなものには、このコマンドをの追加/ LiquiBaseを機能を使用している間

create index indexI on tableT(columnC) 

を変換するliquibase.sqlgenerator.core.CreateIndexGeneratorクラスを拡張LiquiBaseをオラクルのSQLステートメントの終了区切り文字として:

declare 
    index_already_exists exception; 
    pragma exception_init(index_already_exists, -955); 
    -- 
begin 
    execute immediate 'create index indexI on tableT(columnC)'; 
exception 
    when index_already_exists then 
    dbms_output.put_line('Warning: Index indexI already exists'); 
end; 

偶数にして、いくつかの新しい検証を作成します。

mvn liquibase:を使用すると完全に動作しています。しかし、mvn liquibase:updateSQLを使用してSQLを生成する場合、最終的な/(スラッシュ)はありません。 LiquiBaseをのソースコードを見てみると

は、私はクラス LoggingExecutorが、私はこの方法で私は 終了後、最終的な/(スラッシュ)を追加しようとした

} else if (database instanceof OracleDatabase) { 
    output.write(StreamUtil.getLineSeparator()); 
    output.write("/"); 

outputStatementが必要なものを持っていたことが分かりました。あれば、それはこのようになった:コードを生成し、または終了区切り文字として/を設定し、無効なPLSQLコード

ある

end; 
/; 

はSQLで/最終を追加するが、別の方法ですか?

答えて

0

CreateIndexGeneratorを拡張する代わりに、CreateIndexChange.generateStatements()をオーバーライドしてSQLでRawSqlStatementを返すことができます。これにより、終了デリミタをより適切に設定できるようになり、LoggingExecutorでうまく動作する可能性があります。

0

私はliquibase 3.4.2を使用していますが、終了デリミタ/は自動的に認識されます。私が自動的に意味するときは、チェンジセットの宣言でプロパティendDelimiterを使う必要はありません。いくつかの古いバージョンのliquibaseでは、解析中にバグが導入されたことが判明しました。 http://www.liquibase.org/2015/06/liquibase-3-4-0-released.html にチェックしてください。問題が解決されたことがわかりますhttps://liquibase.jira.com/browse/CORE-2227。この問題はバージョン3.3.2に影響していました。 したがって、新しいバージョンを使用するか、チェンジセットの宣言でendDelimiterプロパティを正しく指定することをお勧めします。

http://www.liquibase.org/documentation/changes/sql.html

関連する問題