2

雇用主の 3 つのプライマリ スキーマのうちの 1 つのスターター changeSet xml ファイルをゆっくりと作成しています。唯一の障害は、liquibase によって管理される MySQL ストアド プロシージャのかなり大きなライブラリを組み込んだことです。

1 つの sproc を処理するのが少し面倒でした: 最初のいくつかのステートメントは次のようになります。

use TargetSchema;
select "-- explanatory inline comment thats actually useful --" into vDummy;

set @@session.sql_mode='TRADITIONAL' ;

drop procedure if exists adm_delete_stats ;

delimiter $$

create procedure adm_delete_stats(
...rest of sproc

use ステートメントは非生産的であるとして切り取りましたが、実際の問題は、次のset @@session.sql_modeような例外を引き起こすステートメントです。

 liquibase.exception.MigrationFailedException: Migration failed for change set ./foobarSchema/sprocs/adm_delete_stats.xml::1293560556-151::dward_autogen dward:
 Reason: liquibase.exception.DatabaseException: Error executing SQL ...

そして、delimiter声明は別のつまずきです。

入念な調査を行った結果、却下された MySQL のバグ レポートがここにあり、この MySQL フォーラムのスレッドがここで問題をもう少し詳しく説明していることがわかりました。

とにかく、現在 Liquibase に存在する sproc スクリプトを使用できますか、それとも数百のストアド プロシージャを書き直す必要がありますか?

createProcedure、sqlFile、および sql liquibase タグを試してみましたが、うまくいきませんでした。中心的な問題は、set、delimiter、および同様の SQL コマンドが、サーバーに配信される前にクライアント側のインタープリターによって解釈および処理されることであると考えているからです。 .

4

2 に答える 2

4

はい、問題は、スクリプトが、JDBC にはない追加機能を持つ mysql クライアントを介して実行されると想定していることだと思います。

Liquibase はステートメントを区切り記号 (デフォルトは ; ですが、delimiter 属性で変更できます) で分割し、各ステートメントをデータベースにフィードします。区切り文字として $$ を指定すると、「区切り文字 $$」行を削除できますが、その前の各行には ; が必要になります。$$ に置き換えます。それ以外にも、@@session 行のようなクライアント固有の SQL があります。クライアントを経由しないと不要かもしれないと思いますが、それが何をするのか完全にはわかりません。

手順を機能させることができるはずですが、書き直す必要があります。

すべての手順を書き直したくない場合は、executeCommandタグのようなものを使用できます。これにより、mysql クライアントを呼び出して既存のスクリプトにフィードできるようになります。updateSQL モードのように、liquibase が提供するものをいくつか失います。変更ログを実行するすべての場所に mysql クライアントが存在することを確認する必要がありますが、スクリプトを書き直す必要がなくなります。

于 2010-12-31T01:50:58.430 に答える
2

これは私のために働いた: http://comments.gmane.org/gmane.comp.db.liquibase.user/480

要するに、次のように述べています。

<changeSet id="123321-4" author="ehrhardt">
  <sql>DROP PROCEDURE IF EXISTS curdemo;</sql>
  <sql splitStatements="false" stripComments="false">
    <![CDATA[ 
      CREATE PROCEDURE curdemo()
      BEGIN
        DECLARE done INT DEFAULT 0;
        blah..
        blah..
      END;
    ]]>
  </sql>
  <sql>call curdemo();</sql>
</changeSet>
于 2012-11-26T22:23:47.297 に答える