可以使用存储过程中的动态 SQL 创建 MySQL 触发器吗?

2024-03-23

是否可以使用从存储过程中动态生成的 SQL 在 MySQL 中创建触发器?我通过准备语句在过程中执行其他动态构造的查询,但是当我尝试使用相同的方法创建触发器时,出现以下错误:

错误代码:1295 准备好的语句协议尚不支持此命令

From Bug #31625,准备语句语法不允许创建触发器 http://bugs.mysql.com/bug.php?id=31625我看到自 2007 年以来其他人一直在抱怨同样的事情。

而且从外观上看WL#2871:准备任何 SQL http://forge.mysql.com/worklog/task.php?id=2871目前尚未修复。

这个问题有解决方法吗?是否有另一种使用动态 SQL 创建触发器的方法?

基本上我想做的是动态创建触发器来记录在各种不同表上插入的审计数据。我在 *audit_tables* 表中列出了我想要审核的表。下面的精简过程迭代该表中的条目并尝试创建触发器。

drop procedure if exists curtest;
delimiter |
create procedure curtest()
BEGIN
    DECLARE done INT DEFAULT 0;
    declare tn varchar(16);
    declare cur cursor for select table_name from audit_tables;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur;
    read_loop: LOOP
        fetch cur into tn;
        if done then
            leave read_loop;
        end if;

        /* Create the BEFORE INSERT trigger */
        set @sql = concat('CREATE TRIGGER audit_', tn, '_bi BEFORE INSERT ON ', tn, '
            FOR EACH ROW BEGIN
                set new.foo="bar";
            END;');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE  PREPARE stmt;
    end LOOP;
    close cur;
END;
|
delimiter ;

call curtest();

正如你提到的错误所说,CREATE TRIGGER准备好的语句中不支持命令。

我认为更可行的选择是使用具有 MySQL 绑定的脚本语言(例如 PHP)来自动创建触发器。顺便说一句,我只记得 MySQL Workbench 使用 Lua 作为此类事情的脚本语言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可以使用存储过程中的动态 SQL 创建 MySQL 触发器吗? 的相关文章

随机推荐

  • 获取SQL中WHERE条件的最后一条记录

    i have loanTable包含两个字段loan id and status loan id status 1 0 2 9 1 6 5 3 4 5 1 4 lt How do I select this 4 6 在这种情况下我需要显示最
  • 如何从 FlutterViewController“推送”UIViewController

    我想在我们的 Flutter 视图上 推送 一个新的本机视图 Android 中的 Activity 和 iOS 中的 UIViewController 并在新的本机视图完成 完成后 使屏幕返回到我们的 Flutter 视图 我可以在 An
  • 如何将index.html、jquery.js、main.css捆绑在DLL中以在WPF中使用?

    我知道有可能捆绑 eg index html main css jQuery js Logo gif 到程序集 DLL 中并通过以下方式在 WPF 中使用它res 协议 但我在 Visual Studio 2010 2012 中找不到任何项
  • Java:String split():我希望它在末尾包含空字符串[重复]

    这个问题在这里已经有答案了 我有以下字符串 String str nHERE n nTHERE n nEVERYWHERE n n 如果你只是打印这个 它会像这样输出 当然 n不会 字面地 打印 n HERE n n THERE n n E
  • 节点模块是针对不同的节点模块编译的 67

    我有一个在节点模块版本 67 下编译的节点项目 但现在我收到一个错误 它需要节点模块版本 69 usb bindings node was compiled against a different Node js version using
  • 属性“use”在类型“typeof...”上不存在,属性“extend”在类型“typeof”上不存在

    我第一次使用 TypeScript 构建我的 vue 应用程序 但我一直坚持这个Property xxx does not exist on type typeof问题 我研究过类似的问题 但似乎没有一个有效 我在 vue 3 0 0 0
  • 无法编译 WordCount.java

    mark maestro1 usr lib hadoop wordcount classes javac classpath usr lib hadoop hadoop common 2 0 0 cdh4 0 1 jar usr lib h
  • Powershell:返回具有最大编号的文件名

    假设我有一个像这样的文件名列表 Get ChildItem Antarctica Data xls Antarctica Data 03625516 xls Antarctica Data 84327262 xls Antarctica D
  • AspectJ 编织 Maven 模块

    我有一个项目 有多个 Maven 模块 其中之一包含我的方面 我如何获取各个方面并编织多个 Maven 模块 AspectJ Maven 插件的文档有点稀疏 无法找到很多示例 我尝试将aspectj 插件放入父pom 中 但它似乎没有应用其
  • 如何将 Excel 工作簿写入 .NET 中的 MemoryStream?

    如何将 Excel 工作簿写入MemoryStream而不先将其保存到文件系统 内的所有选项Microsoft Office Interop Excel WorkBook保存选项采用文件名 我对 PIA 以及将 Excel 文件存储在文档存
  • “OneHotEncoder”对象没有属性“get_feature_names”

    我正在尝试使用 scikit learn 的 OneHotEncoder 对象的 get feature names 函数提取特征 但它向我抛出一个错误 OneHotEncoder 对象没有属性 get feature names 下面是代
  • 带/不带类的回调函数指针 C++

    我被困 我正在尝试形成一个函数 它将吃掉无类函数指针和对象中的函数指针 这是我当前的代码 希望能解释更多 它应该在 Arduino 上运行 所以我不能使用大型库 首先 我在 Arduino 上使用这个库 SimpleTimer A time
  • Flyway 仅在我的 jar 文件中找不到迁移

    我有类似的问题this https stackoverflow com questions 11226070 flyway not finding the migrations in a jar file但我已经迁移到版本 2 1 1 问题
  • 在应用程序和 Web 之间共享数据库

    我参与了一个必须从现有数据库检索查询的应用程序 该数据库必须在远程服务器中的 php 中实现 并且将是管理员必须将内容插入共享数据库的地方 但我不知道如何正确实现或什么是最佳解决方案 我正在考虑使用 php 创建一个 sqlite 数据库并
  • ld:找不到 -lIOKit.A clang xcode 的库

    我使用项目的 Target 部分将 libIOKit A dylib 库包含到我的 Xcode 项目中 如下图所示 该项目已构建并运行良好 我在编译状态中遇到一些有线错误 ld 找不到 lIOKit 的库 A clang 错误 链接器命令
  • 将 Entity Framework Data First 与 ODBC 和 MySQL 结合使用

    我怎样才能创建一个ADO NET 实体数据模型使用 ODBC 连接 MySQL 我在本地主机上安装了 MySQL 3 51 ODBC 驱动程序 并创建了一个测试 MySQL 数据库 然后使用 VS2013 我使用 ODBC 数据源创建到我的
  • 如何从函数中实时捕获打印内容?

    我想捕捉所有prints 并执行诸如返回它们之类的操作 但继续运行该函数 我找到了这个方法 但它只返回print代码完成后 f io StringIO with redirect stdout f my code return f getv
  • Lua:setfenv() 与 _ENV

    Lua 切换有什么大不了的setfenv to ENV 在各种 新增内容 资料中 这一举措被认为是 Lua 5 1 和 5 2 版本之间最重要的变化之一 但是 PIL 和其他地方给出的示例可以修剪为以下内容 Lua 5 1 Lua 5 2
  • 提交了我的 php 表单,但没有发送任何值

    由于某种原因 这些选项没有显示在我的电子邮件中 我可以很好地发送电子邮件 我可以看到正文及其所有评论 但看不到用户所做的任何条目 我知道我做错了什么 但我无法确定它是什么 另外 如果它看起来很糟糕 请随意嘲笑我 ToEmail email
  • 可以使用存储过程中的动态 SQL 创建 MySQL 触发器吗?

    是否可以使用从存储过程中动态生成的 SQL 在 MySQL 中创建触发器 我通过准备语句在过程中执行其他动态构造的查询 但是当我尝试使用相同的方法创建触发器时 出现以下错误 错误代码 1295 准备好的语句协议尚不支持此命令 From Bu