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"。