关于mysql中触发器执行动态sql的问题
2009-10-26 15:55
399 查看
这几天手头开发的系统要做一个类似windows账户到期时间的功能,考虑了半天想出了一个技术上和逻辑上都还能实现的解决方案:
创建一个用户存入数据库的时候都创建一个事件调度器来控制用户的到期时间(mysql的时间调度器确实很方便)。想起来是很简单,但是做起来问题确实一波接一波...
一些小问题就不说了,到了关键的地方了:在插入一个用户的时候我到底是在应用层来添加一个事件调度器呢还是在数据库里面自动添加。
当然不管从代码的美观上、系统设计的思想上或是运行效率上来说,我都应该选择后者(废话...)。于是我就选择了后者(你敢再说废话吗)。那么就有了今天的这段笔记...
一开始我兴致勃勃的拼好字符串什么的,写了如下一个触发器
delimiter //
create trigger tri_user after insert on user for each row
begin
set @u_name = new.u_name;
set @expire = '';
select sm_pwd_alter_day into @expire from system_manage where sm_id = 1;
set @str = concat('create EVENT eve_', @u_name, ' ON SCHEDULE EVERY ', @expire, ' day DO
update user set u_enable = /'未启用/' where u_name = /'', @u_name, '/'');
prepare stmt_str from @str;
execute stmt_str;
DEALLOCATE PREPARE stmt_str;
end;
//
delimiter ;
仔细检查了语法,然后兴高采烈的运行...(orz)结果却是下面这行错误提示:
“Dynamic SQL is not allowed in stored function or trigger”
my god,原来mysql的触发器不支持动态sql,于是上网baidu寻找替代方法,无果,
然后google,方法出现:有人也遇到了触发器里执行动态sql的问题,然后发帖,后面高手解答说
把动态sql语句传入存储过程里,然后在触发器里调用存储过程就可以了。然后那位楼主还给了高手
70分(悲剧,后面说)...我想这次到位了。于是模仿之、于是运行之、于是出现结果:
“Dynamic SQL is not allowed in stored function or trigger”
卧槽...还是这个结果...
于是我明白了结了贴的也不一定是正确答案。
那么我以为存储过程里运行动态sql,然后触发器再调用这个存储过程,还是相当于在触发器里运行动态sql。
不想再去深究了,还是老老实实在应用程解决这个问题了。
创建一个用户存入数据库的时候都创建一个事件调度器来控制用户的到期时间(mysql的时间调度器确实很方便)。想起来是很简单,但是做起来问题确实一波接一波...
一些小问题就不说了,到了关键的地方了:在插入一个用户的时候我到底是在应用层来添加一个事件调度器呢还是在数据库里面自动添加。
当然不管从代码的美观上、系统设计的思想上或是运行效率上来说,我都应该选择后者(废话...)。于是我就选择了后者(你敢再说废话吗)。那么就有了今天的这段笔记...
一开始我兴致勃勃的拼好字符串什么的,写了如下一个触发器
delimiter //
create trigger tri_user after insert on user for each row
begin
set @u_name = new.u_name;
set @expire = '';
select sm_pwd_alter_day into @expire from system_manage where sm_id = 1;
set @str = concat('create EVENT eve_', @u_name, ' ON SCHEDULE EVERY ', @expire, ' day DO
update user set u_enable = /'未启用/' where u_name = /'', @u_name, '/'');
prepare stmt_str from @str;
execute stmt_str;
DEALLOCATE PREPARE stmt_str;
end;
//
delimiter ;
仔细检查了语法,然后兴高采烈的运行...(orz)结果却是下面这行错误提示:
“Dynamic SQL is not allowed in stored function or trigger”
my god,原来mysql的触发器不支持动态sql,于是上网baidu寻找替代方法,无果,
然后google,方法出现:有人也遇到了触发器里执行动态sql的问题,然后发帖,后面高手解答说
把动态sql语句传入存储过程里,然后在触发器里调用存储过程就可以了。然后那位楼主还给了高手
70分(悲剧,后面说)...我想这次到位了。于是模仿之、于是运行之、于是出现结果:
“Dynamic SQL is not allowed in stored function or trigger”
卧槽...还是这个结果...
于是我明白了结了贴的也不一定是正确答案。
那么我以为存储过程里运行动态sql,然后触发器再调用这个存储过程,还是相当于在触发器里运行动态sql。
不想再去深究了,还是老老实实在应用程解决这个问题了。
相关文章推荐
- 关于mysql 执行批量的sql 语句问题:&allowMultiQueries=true
- 关于执行动态SQL问题
- 关于Oracle 的定时执行作业问题(动态PL/SQL)
- 关于SQL中 动态执行SQL语句并且获得动态SQL语句输出参数值的问题
- MySQL之视图、存储过程、触发器、函数、事务、动态执行SQL
- 动态执行Sql语句与临时表的问题(对象名无效)
- 使用Jmeter对Mysql进行压力测试无法执行多条sql语句问题
- 关于不同sql语句执行效率的问题
- 请教一个关于javascript执行sql语句的问题
- 关于统计的一个sql问题,使用动态sql语句实现。
- 在存储过程中执行动态sql后的返回值的问题
- mybatis动态sql解决关于There is no getter for property named 'certitype'错误问题
- mysql存储过程执行动态sql语句
- MySQL存储过程中实现执行动态SQL语句的方法
- 关于触发器在行级和语句级的执行顺序问题
- mysql存储过程执行动态sql语句并返回值
- Mysql bench执行sql语句批量操作数据所遇到的问题
- mysql 字符串分割 和 动态执行拼接sql
- 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题
- 关于多态性的动态绑定问题, 对象调用方法的执行过程.