首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用嵌入式mysql C++创建触发器

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

Stack Overflow用户
提问于 2016-07-14 19:31:16
回答 1查看 590关注 0票数 1

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

代码语言:javascript
复制
[libmysqld_server]
basedir=./
datadir=./Database

我可以编程地创建一个没有问题的触发器。

代码语言:javascript
复制
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报告的问题

代码语言:javascript
复制
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系统表有问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-15 12:40:09

解决方案很简单,只需验证" mysql“数据库是否与嵌入在libmysqld中的mysql版本相同。我通过以下内容验证了我的客户版本信息:

代码语言:javascript
复制
const char * version = mysql_get_client_info();

它返回了"5.1.44“,而不是我预期的"5.5.16”。下载mysql存档5.1.44并在datadir中使用mysql数据库解决了我遇到的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38382722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档