一、存储过程的查询
1、通过数据字典表查询
存储过程的定义信息保存在数据字典表information_schema.routines中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<span style="font-size: 16px;">mysql> <span style="color: rgba(0, 0, 255, 1);">select</span><span style="color: rgba(0, 0, 0, 1);"> ROUTINE_NAME, ROUTINE_TYPE </span>-> <span style="color: rgba(0, 0, 255, 1);">from</span><span style="color: rgba(0, 0, 0, 1);"> information_schema.ROUTINES </span>-> <span style="color: rgba(0, 0, 255, 1);">where</span> ROUTINE_SCHEMA=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">db1</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">; </span>+----------------+--------------+ | routine_name | routine_type | +----------------+--------------+ | difference | PROCEDURE | | inout_param | PROCEDURE | | in_param | PROCEDURE | | out_param | PROCEDURE | | VerboseCompare | FUNCTION | | Ver_Compare | FUNCTION | +----------------+--------------+<span style="color: rgba(0, 0, 0, 1);"> mysql</span>> SELECT name FROM mysql.proc WHERE db=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">db1</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">; </span>+----------------+ | name | +----------------+ | difference | | inout_param | | …… | +----------------+</span> |
2、使用show语句查询
SHOW PROCEDURE STATUS WHERE db=’数据库名’;
3、查看存储过程详细的定义信息
SHOW CREATE PROCEDURE 数据库.存储过程名;
二、存储过程的修改
注意:
ALTER {PROCEDURE | FUNCTION}……语句只能改变存储过程的特征,不能修改过程的参数以及过程体。如果想做这样的修改,必须先使用DROP PROCEDURE 删除过程,然后使用and CREATE PROCEDURE重建过程。
1 2 3 4 5 6 7 |
<span style="font-size: 16px;">ALTER {PROCEDURE |<span style="color: rgba(0, 0, 0, 1);"> FUNCTION} sp_name [characteristic ...] characteristic: COMMENT </span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">string</span><span style="color: rgba(128, 0, 0, 1);">'</span> |<span style="color: rgba(0, 0, 0, 1);">LANGUAGE SQL </span>|{ CONTAINS SQL | NO SQL | READS SQL DATA |<span style="color: rgba(0, 0, 0, 1);"> MODIFIES SQL DATA } </span>|SQL SECURITY { DEFINER | INVOKER }</span> |
存储过程的特征characteristic:指定存储的特性
1、COMMENT ‘string’是注释信息;
LANGUAGE SQL是指明过程体是用sql语言编写的,而不是java或php;
2、SQL SECURITY { DEFINER | INVOKER }指明谁有权限来执行:
DEFINER表示只有定义者自己才能够执行;
INVOKER表示调用者可以执行。
在存储过程定义时:
1 2 3 4 |
<span style="font-size: 16px;"><span style="color: rgba(0, 0, 0, 1);">CREATE [DEFINER </span>= { user |<span style="color: rgba(0, 0, 0, 1);"> CURRENT_USER }] PROCEDURE ……</span></span> |
[DEFINER = { user | CURRENT_USER }]:指定存储过程的定义者,指定CURRENT_USER和不指定定义者选项的效果是一样的
3、{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:
MySQL现在不使用:
CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;
NO SQL表示子程序中不包含SQL语句;
READS SQL DATA表示子程序中包含读数据的语句;
MODIFIES SQL DATA表示子程序中包含写数据的语句。
三、存储过程的删除
DROP PROCEDURE [IF EXISTS] db_name.sp_name;
如果是在当前数据库中的存储过程:DROP PROCEDURE [过程1[,过程2…]]
从MySQL的表格中删除一个或多个存储过程。
四、存储过程的安全
不是每个用户都可以调用一个存储过程;一个用户想调用其它用户创建的过程,必须被授予过程的execute权限:
1 2 3 4 |
<span style="font-size: 16px;"><span style="color: rgba(0, 0, 0, 1);">GRANT EXECUTE ON PROCEDURE </span><过程名><span style="color: rgba(0, 0, 0, 1);"> TO </span><user></span><span style="font-family: 'Microsoft YaHei'; font-size: 18px; line-height: 1.5; background-color: rgba(255, 255, 255, 1);"> </span> |