昨天新有个新需求,sql事件每月会自动生成一个新得日志表单,需要写一个事件和存储过程自动对生成表单的相应sql用户进行授权。于是这个任务就落到我头上,说实话我对sql存储过程也不是很熟,在写存储过程的时候遇到各种坑。不过还好有万能的网友的无私奉献的各种例子可以参考,最终耗时30小时(从接任务开始算,也包括睡觉时间)初步完成了任务。现在总结一下遇到的各种坑。
刚开始我的存储过程是这样的:
delimiter //
CREATE PROCEDURE View_authorization()
BEGIN
/*这里定义了一大堆的变量*/
DECLARE g_slet,g_grant_ex,g_grant_ex,g_ex_1,g_ex_2,g_re_1,g_re_2,sql_re_1,sql_re_2,sql_ex_1,sql_ex_2 varchar(200) DEFAULT NULL;
DECLARE g_tt,g_year,g_slet_re,g_slet_ex INT DEFAULT 0;
/*最恶心就是这里了。之前一直给我报查询失败的错。后来解决了。但是又开始报截断错误。我查了一下才发现是我的数据类型忘改了~*/
set @g_year=DATE_FORMAT(CURRENT_DATE(),'%y_%m');
/*这里本来想先查询一下表是否生成的,但是这个动态sql赋值实在是变态的难搞。后来被我干掉了*/
g_tt=(SELECT MONTH(CURRENT_DATE ()));
select count(*) into g_slet_re from information_schema.TABLES t where t.TABLE_SCHEMA ="gamedb" and t.TABLE_NAME = concat('tb_recharge_cc_',g_year);
select count(*) into g_slet_ex from information_schema.TABLES t where t.TABLE_SCHEMA ="gamedb" and t.TABLE_NAME = concat('tb_exchange_cc_',g_year);
set g_grant_ex='grant SELECT ON gamedb.tb_exchange_cc_';
set g_grant_re='grant SELECT ON gamedb.tb_recharge_cc_';
set @sql_re_1=concat(@g_slet_re,@g_year,'"'