私の雇用者のプライマリ・スキーマの3つのいずれかのために、ゆっくりとstartter changeSet xmlファイルを作成します。唯一のショーストッパーは、liquibaseによって管理される大規模なMySQLストアドプロシージャライブラリを組み込んでいます。JDBC w/liquibaseとMySQLのセッション変数とクライアント側のSQL命令の回避策があります
一つ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
文は別のつまずきです。
Doing do dilligence research私はこの拒否されたMySQLバグレポートhereとこの問題に深く関わるこのMySQLフォーラムスレッドhereを見つけました。
私は現在、Liquibaseに存在するsprocスクリプトを使用できますか?何百ものストアドプロシージャを書き直す必要がありますか?
set、delimiter、および同様のSQLコマンドが解釈され、クライアントサイドインタプリタによって実行されることを前提としているため、createProcedure、sqlFile、およびsql liquibaseタグを試しました。サーバーに配信されます。
はあなたの努力のためのアップ票を与え、私は/区切り文ではなく@@ session.sql_modeをスクラップしますすることができます指令は非交渉可能な要件です。 MySQLの場合、MySQLには実際のエラー処理ロジックがないため、すべての警告をエラーとして扱うようにクライアントライブラリに指示します。sproc呼び出しの致命的なエラーはほとんど完全に失われるか、または低下することがあります。プロシージャの作成時にSQLモードをシフトすると、プロシージャはそのモードで実行されます。 – David
それ以外の場合は、executeCommandを使用することをお勧めします。私がliquibaseをエンジニアリング部門のほぼすべてのマシンでセミポータブルに設定しているので、データベースのクレデンシャルはプライマリコールスクリプトに一時的にエクスポートする独立したスクリプトファイルにあります。 executeCommandプロセスが親のスコープを継承するかどうかを調べる必要があります。 – David