我正在使用 Windows 上的 C++ 应用程序中的 libmysqld c 库,以便与嵌入式 mysql 服务器交互,即在嵌入它的进程的生命周期内在线的 mysql 服务器。创建数据库的应用程序使用 mysql .ini 文件来创建相对于应用程序目录的 datadir,而不是在全局 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 表不存在,因为我的应用程序特定数据目录中没有 mysql 数据库。我曾尝试从 C:\Program Files\MySQL... 的安装目录中复制 mysql 文件夹,但后来我遇到了 mysql 报告的问题
Error:Cannot load from mysql.proc. The table is probably corrupted
我看到的与上述错误相关的唯一建议是运行“mysql_upgrade”命令,该命令似乎不适用于使用自己的数据目录的嵌入式数据库。我正在创建所有表并设置它们各自的触发器,但无法解决这个 mysql.proc 错误。
更新:
我在这里也看到了一些不一致的行为。我的 MySQL 版本是“mysql-5.5.16-win32”,它带有一个 mysql_embedded.exe 二进制文件,我可以用它来打开一个控制台并指向我的应用程序未运行时生成的数据库文件。当我在 mysql_embedded.exe 中执行操作时,触发器可以正常工作(没有“mysql.proc 可能已损坏”错误)。所以似乎只有 libmysqld c api 与 mysql 系统表有问题。