我正在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表不存在,因为我在应用程序特定的datadir中没有mysql数据库。我尝试过从C:\Program \ mysql中的安装目录复制MySQL文件夹.但是,我遇到了mysql报告的问题
Error:Cannot load from mysql.proc. The table is probably corrupted我看到的与上述错误相关的唯一建议是运行'mysql_upgrade‘命令,对于使用自己数据的嵌入式数据库来说,这个命令似乎不起作用。我所处的位置是创建所有的表,并设置它们各自的触发器,但是无法绕过这个mysql.proc错误。
更新:
我也看到了一些不一致的行为。我的MySQL版本是“mysql-5.5.16-Win 32”,它附带了一个mysql_embedded.exe二进制文件,可以用来打开控制台并指向应用程序在没有运行时生成的数据库文件。当我在mysql_embedded.exe中执行操作时,触发器工作时没有问题(没有'mysql.proc可能损坏‘错误)。因此,似乎只有libmysqld c api对mysql系统表有问题。
发布于 2016-07-15 12:40:09
解决方案很简单,只需验证" mysql“数据库是否与嵌入在libmysqld中的mysql版本相同。我通过以下内容验证了我的客户版本信息:
const char * version = mysql_get_client_info();它返回了"5.1.44“,而不是我预期的"5.5.16”。下载mysql存档5.1.44并在datadir中使用mysql数据库解决了我遇到的问题。
https://stackoverflow.com/questions/38382722
复制相似问题