使用嵌入式 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 数据库解决了我遇到的问题。
我正在 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 数据库解决了我遇到的问题。