【问题标题】:Can MySQL triggers be created with dynamic SQL from within a stored procedure?可以在存储过程中使用动态 SQL 创建 MySQL 触发器吗?
【发布时间】:2011-08-24 07:05:27
【问题描述】:

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

ERROR Code: 1295Prepared Statement 协议尚不支持该命令

来自 Bug #31625, PREPARED STATEMENT syntax does not allow to create TRIGGERS 我看到其他人自 2007 年以来一直在抱怨同样的事情。

而且从 WL#2871: Prepare any SQL 的样子来看,它还没有被修复。

是否有解决此问题的方法?是否有另一种使用动态 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();

【问题讨论】:

  • 我想问同样的问题。我什至尝试将触发器数据直接插入到 information_schema.triggers 表中,但是 root 帐户都无权这样做。由于我必须创建很多触发器,手动执行此操作非常烦人。

标签: mysql triggers dynamic-sql


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2011-07-20
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2011-04-15
    • 1970-01-01
    相关资源
    最近更新 更多