2016-07-14 20 views
1

埋め込み型のmysqlサーバ、つまり埋め込まれたプロセスの生存期間中オンラインのmysqlサーバとのインタフェースをとるために、WindowsのC++アプリケーションでlibmysqld Cライブラリを使用しています。データベースを作成するアプリケーションは、mysql .iniファイルを使用して、グローバルなmysqlインストールフォルダではなく、アプリケーションディレクトリを基準にしてデータディレクトリを作成します。埋め込みmysqlを使用したトリガの作成

私はプログラムで問題なくトリガを作成できます。

status = mysql_query(mysql, 
     "CREATE TRIGGER del_trigger AFTER DELETE ON table FOR EACH ROW\ 
     INSERT INTO otherTable (col1, col2) VALUES (OLD.col1, OLD.col2)\ 
     "); 

    if (status == 0) { 
     Log(DEBUG, "Initialize(): <%p> Delete Trigger creation passed ...", this); 
    } 
    else { 
     Log(DEBUG, "Initialize(): <%p> Delete Trigger creation failed with error %s...", this, mysql_error(mysql)); 
    } 

私はしかしに実行する問題は、トリガーが呼び出されたときに、私は自分のアプリケーション固有のDATADIR内部のMySQLデータベースを持っていないので、mysqlはてmysql.procテーブルが存在しないことに文句を言うだろうということです。私はCにインストールディレクトリからのmysqlフォルダをコピーしようとしている:\プログラムファイルを\ MySQLの...しかし、私は、MySQLが

Error:Cannot load from mysql.proc. The table is probably corrupted 

私は上記のエラーに関連する見ているだけアドバイスを報告する問題に遭遇しています'mysql_upgrade'コマンドを実行します。このコマンドは、独自のdatadirを使用して組み込みデータベースの場合には機能しません。私はすべてのテーブルが作成され、それぞれのトリガーが設定されているが、このmysql.procエラーを回避することはできない。

UPDATE:私もここにいくつかの矛盾した行動を見てい

。私のバージョンのMySQLは "mysql-5.5.16-win32"で、mysql_embedded.exeバイナリが付属しています。このバイナリは、コンソールを開いて、アプリケーションが実行していないときにアプリケーションによって生成されたデータベースファイルを指し示すために使用できます。 mysql_embedded.exeで操作を実行すると、トリガーは問題なく動作します( 'mysql.procはおそらく壊れています'エラー)。だから、libmysqld c apiだけがmysqlシステムテーブルに問題があるようです。

答えて

0

"mysql"データベースがlibmysqldに埋め込まれたmysqlバージョンと同じバージョンであることを確認するのと同じくらい簡単でした。私は、次の経由で私のクライアントのバージョン情報を確認さ:

const char * version = mysql_get_client_info(); 

これは、「5.1.44」の代わりに、私は期待していた「5.5.16」を返しました。 5.1.44用のmysql ZIPアーカイブをダウンロードし、datadirのmysqlデータベースを使用して、私が経験していた問題を修正しました。

関連する問題