一、修改

使用alter语句可以修改存储过程或函数的特性。

alter {procedure | function } sp_name {characteristic ...}

其中,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语句,但是,这两个语句的结构是一样的,语句中的所有参数也是一样的。而且,它们与创建存储过程或存储函数的语句中的参数也是基本一样的。

【例1】修改存储过程CountProc的定义。将读写权限改为MODIFUES SQL DATA,并且指明调用者可以执行,代码如下:

mysql> alter procedure CountProc
    -> modifies sql data
    -> sql security invoker;
Query OK, 0 rows affected (0.01 sec)

查询修改后的CountProc表的信息

select specific_name,sql_data_access,security_type
from information_schema.Routines
where routine_name='CountProc' and routine_type = 'procedure';
Empty set (0.00 sec)

在这里是一张空表,如果是正常修改就可以看到数据的权限改变了,安全类型也改变了。

【例2】修改村粗函数NameByZip的定义,将读写权限改为reads sql data,并加上注释信息"find name",SQL语句如下:

mysql> alter function NameByZip
    -> reads sql data
    -> comment 'find name' ;
Query OK, 0 rows affected (0.06 sec)

mysql> select specific_name,sql_data_access,routine_comment
    -> from information_schema.Routines
    -> where routine_name='NameByZip' and routine_type = 'function';
Empty set (0.00 sec)

如果表不为空,就会看到访问数据的权限改编为reads sql data,函数注释变成find name。

二、删除

删除存储过程和函数,使用drop函数,语法形式如下:

drop {procedure | function} [ if exists] sp_name

这个语句被用来移除一个存储过程或函数,sp_name为要移除的存储过程或函数的名称。
if exists 子句是一个MySQL的扩展,如果程序或函数不存储,那么它可以防止发生错误,产生一个用show warnings查看的警告。

【例3】删除存储过程和存储函数,SQL语句如下:

drop procedure CountProc;
drop function ContProc;

语句的执行结果如下:

mysql> drop procedure CountProc;
Query OK, 0 rows affected (0.03 sec)

mysql> drop function NameByZip;
Query OK, 0 rows affected (0.05 sec)

上述语句的作用就是删除存储过程CountProc和存储函数NameByZip