使用嵌入式 mysql C++ 创建触发器

Creating triggers using embedded mysql C++

我正在 windows 上的 C++ 应用程序中使用 libmysqld c 库,以便与嵌入式 mysql 服务器接口,即 mysql 服务器在嵌入它的进程的生命周期内在线。创建数据库的应用程序使用 mysql .ini 文件创建相对于应用程序目录的数据目录,而不是在全局 mysql 安装文件夹中,例如

[libmysqld_server]
basedir=./
datadir=./Database

我可以毫无问题地以编程方式创建触发器,例如

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));
    }

我 运行 遇到的问题是,当调用触发器时,mysql 会抱怨 mysql.proc table 不存在,因为我没有我的应用程序特定数据目录中的 mysql 数据库。我已经尝试从 C:\Program Files\MySQL 中的安装目录复制 mysql 文件夹...但是后来我 运行 遇到 mysql 报告

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

我看到的与上述错误相关的唯一建议是 运行 'mysql_upgrade' 命令,该命令似乎不适用于使用其自己的数据目录的嵌入式数据库。我正处于创建所有 table 并设置其各自触发器的地步,但无法解决此 mysql.proc 错误。

更新:

我在这里也看到了一些不一致的行为。我的 MySQL 版本是 "mysql-5.5.16-win32" 并且它带有一个 mysql_embedded.exe 二进制文件,我可以用它打开一个控制台并指向我的应用程序生成的数据库文件,当它不是 运行宁。当我在 mysql_embedded.exe 中执行操作时,触发器可以正常工作(没有 'mysql.proc is probably corrupted' 错误)。所以似乎只有 libmysqld c api 与 mysql 系统 tables.

有问题

解决方案非常简单,只需验证 "mysql" 数据库与 libmysqld 中嵌入的 mysql 版本相同。我通过以下方式验证了我的客户端版本信息:

const char * version = mysql_get_client_info();

这返回了“5.1.44”而不是我期望的“5.5.16”。下载 5.1.44 的 mysql ZIP 存档并使用数据目录中的 mysql 数据库解决了我遇到的问题。