【问题标题】:Creating triggers using embedded mysql C++使用嵌入式 mysql C++ 创建触发器
【发布时间】:2023-03-22 04:40:02
【问题描述】:

我正在 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 系统表有问题。

【问题讨论】:

    标签: c++ mysql database windows libmysql


    【解决方案1】:

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

    const char * version = mysql_get_client_info();
    

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

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 1970-01-01
      • 2011-02-03
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多