1

DB へのすべての挿入をインターセプトするには、トリガーから外部スクリプトを呼び出す必要があります。これは、その値をポーリングできないためです。ARM アーキテクチャと 250MB の RAM しかない組み込みシステム用にコーディングしています。トリガーは適切なオプションであり、トリガーのコードはうまく機能します。

FUNCTION mydb.sys_exec does not exist (MySQL error code: 1305, SQLState: 42000 )

だから私はこれをインストールしようとしました: https ://github.com/mysqludf/lib_mysqludf_sys

しかし、それは私を取得します:

ERROR: You need libmysqlclient development software installed 
to be able to compile this UDF, on Debian/Ubuntu just run:
apt-get install libmysqlclient15-dev

だから私がタイプすると

sudo apt-get install libmysqlclient15-dev

私は得る:「libmysqlclient15-dev」の代わりに「libmysqlclient-dev」を選択することに注意してください

もちろん、それは機能しないため、適切なパッケージではありません。git に含まれる .so ファイルは intelx86 用にコンパイルされています。

誰にもアイデアがありますか?git で .c をコンパイルすることは、多くの依存関係が欠落しているため、まったく不可能です。

または..sys_execなしでトリガーから外部スクリプトを実行するにはどうすればよいですか?

PS: 完全を期すために、これはトリガー スクリプトです。

区切り記号 @@

CREATE TRIGGER command_controller
AFTER INSERT ON myDB.foo
FOR EACH ROW
BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result int(10);
 SET cmd='./foo ';
 SET result = sys_eval(cmd);
END;
@@
DELIMITER ;
4

1 に答える 1

3

これが私のために働く最小バージョンです:

#include <string.h>
#include <stdlib.h>
#include <mysql.h>

my_bool sys_exec_init(
  UDF_INIT *initid
, UDF_ARGS *args
, char *message
){
  unsigned int i=0;
  if(args->arg_count == 1
  && args->arg_type[i]==STRING_RESULT){
    return 0;
  } else {
    strcpy(
      message
    , "Expected exactly one string type parameter"
    );
    return 1;
  }
}
void sys_exec_deinit(
  UDF_INIT *initid
){
}
my_ulonglong sys_exec(
  UDF_INIT *initid
, UDF_ARGS *args
, char *is_null
, char *error
){
  return system(args->args[0]);
}

次の行でコンパイルします。

gcc -Wall -I include -I /home/rbouman/mysql/mysql-5.6.10-linux-glibc2.5-x86_64/include -shared -fPIC -o sys_exec.so sys_exec.c
于 2013-04-29T15:09:00.370 に答える