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

nic*_*way 6 mysql triggers dynamic-sql

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

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

Bug#31625开始,PREPARED STATEMENT语法不允许创建TRIGGERS我看到自2007年以来其他人一直抱怨同样的事情.

WL#2871的外观来看:准备任何尚未修复的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();
Run Code Online (Sandbox Code Playgroud)

Xin*_*nt0 3

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

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