Mysql教程

14.4修改存储过程和函数

修改存储过程和函数是指修改已经定义好的存储过程和函数。MySQL中通过ALTER PROCEDURE语句来修改存储过程。通过ALTER FUNCTION语句来修改存储函数。本小节将详细讲解修改存储过程和函数的方法。

MySQL中修改存储过程和函数的语句的语法形式如下:

ALTER {PROCEDURE | FUNCTION} sp_name [characteristic...]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

其中,sp_name参数表示存储过程或函数的名称;characteristic参数指定存储函数的特性。CONTAINS SQL表示子程序包含SQL语句,但不包含读或写数据的语句;NO SQL 表示子程序中不包含SQL语句;READS SQL DATA表示子程序中包含读数据的语句; MODIFIES SQL DATA表示子程序中包含写数据的语句。SQL SECURITY { DEFINER | INVOKER}指明谁有权限来执行。DEFINER表示只有定义者自己才能够执行;INVOKER 表示调用者可以执行。COMMENT'string'是注释信息。

说明:修改存储过程使用ALTER PROCEDURE语句,修改存储函数使用ALTER FUNCTION语句。但是,这两个语句的结构是一样的,语句中的所有参数都是 一样的。而且,它们与创建存储过程或函数的语句中的参数也是基本一样的。

【示例14-24】下面修改存储过程num_from_employee的定义。将读写权限改为 MODIFIES SQL DATA,并指明调用者可以执行。代码执行如下:

ALTER PROCEDURE num_from_employee MODIFIES SQLDATA SQL SECURITY INVOKER ;

执行代码,并查看修改后的信息。结果显示如下:

//执行ALTEER PROCEDURE 语句
mysql> ALTER PROCEDURE num_from_employee
-> MODIFiES SQL DATA
-> SQL SECURITY INVOKER ;
Query OK, 0 rows affected (0.00 sec)
//查询修改后num_from_employee表的信息
mysql> SELECT SPECrFIC_NAME,SQL_DATA_ACCESS,SECURITY_TYPE FROM informa_tion_schema.Routines WHERE ROUTINE_NAME='num_from_employee';
+-------------------+----------------------+-------------+
|  SPECIFIC_NAME    |    SQL_DATA_ACCESS   |SECURITY_TYPE|
+-------------------+----------------------+-------------+
| num_from_employee |  MODIFIES SQL DATA   |   INVOKER   |
+-------------------+----------------------+-------------+
1 row in set (0.00 sec)

结果显示,存储过程修改成功。从查询的结果可以看出,访问数据的权限(SQL_DATA_ACCESS)已经变成MODIFIES DATA,安全类型(SECURTTY_TYPE) 已经变成了 INVOKER。

【示例14-25】下面修改存储函数name_from_employee的定义。将读写权限改为 READS SQL DATA, 并加上注释信息‘FIND NAME’。代码执行如下:

ALTER FUNCTION name_from_employee READS SQL DATA
COMMENT 'FIND NAME';

执行代码,并查看修改后的信息。结果显示如下:

//执行 ALTE FUNCTION 语句
mysql> ALTER FUNCTION name_from_employee
-> READS SQL DATA
-> COMMENT 'FIND NAME';
Query OK, 0 rows affected (0.00 sec)
//查询修改后num_from_employee表的信息
mysql> SELECT SPECIFIC_NAME,SQL_DATA_ACGESS,ROUTINE_COMMENT FROM information_schema.Routines WHERE ROUTiNE_NAME='name_frohi_employee';
+--------------------+-----------------+-----------------+
|  SPECIFIC_NAME     | SQL_DATA_ACCESS | ROUTINE_COMMENT |
+--------------------+-----------------+-----------------+
| name_from_employee | READS SQL DATA  |    FIND NAME    |
+--------------------+-----------------+-----------------+
1 row in set (0.01 sec)

结果显示,存储函数修改成功。从查询的结果可以看出,访问数据的权限 (SQL_DATA_ACCESS )已经变成 READS SQL DATA,函数注释(ROUTINE_COMMENT)经变成了"FIND NAME"。


关注微信获取最新动态