是否可以使用从存储过程中动态生成的 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(使用前将#替换为@)