使用MySQL 5.1.36,我正在尝试编写触发器,以从“暂存”数据库中删除暂存表。
CREATE DEFINER=`root`@`localhost` TRIGGER
`jobq`.`DropScratch`
BEFORE DELETE ON jobq.jobq FOR EACH ROW
BEGIN
DECLARE tblname VARCHAR(128);
set tblname=concat('scratch.',OLD.jobname);
DROP TABLE IF EXISTS tblname;
END;
我总是遇到错误:
Explicit or implicit commit is not allowed in stored function or trigger.
我能以某种方式克服这一限制吗?
先谢谢你
阿曼
最佳答案
这里的主要问题是不允许您在触发器内删除表。这就是错误消息指出“隐式提交”时所得到的。删除表执行隐式提交。
因此,除了触发器之外,您还需要找出其他方法来执行此操作。一种方法是设置一个cron作业,该作业将information_schema.tables中的数据与jobq表进行比较,以在临时数据库中查找可以删除的表,然后将其删除。
我还应该指出,您尝试动态创建放置表语句的方式将行不通。这将删除一个名为“ tblname”的表,而不是“ scratch.jobname”。如果要动态删除表,则需要使用单独的脚本语言(例如python,perl,shell等)构建drop table语句。
祝好运!