MySql笔记(存储过程)

来源:互联网 发布:h3c 查看端口日志 编辑:程序博客网 时间:2024/05/16 15:51

存储过程是使用CALL语句来调用的独立操作,不能用在表达式里。定义为CREATE PROCEDURE ...
适用于存储过程的情况有两种:

  • 只需通过运算来实现某种效果或动作,不需要返回值;
  • 运算结果需要返回多个结果集(函数无法做到);

存储函数常用在表达式里,会执行计算并返回一个值。定义为CREATE FUNCTION ...
函数无法返回多个值。如果要实现返回多个值,有两种办法:

  • 编写多个函数,在同一条语句里调用所有这些函数;
  • 使用一个存储过程,通过它的OUT参数“返回”这些值。

触发器会在执行表的INSERTDELETEUPDATE语句时被自动激活。触发器可被设置成在语句处理各行之前或之后激活。定义为CREATE TRIGGER

事件是一个与计划相关联的存储程序。计划会定义事件执行的时间或次数,并且还可以定义事件何时强制退出。定义为CREATE EVENT。只有当事件调度器被设置为启动时,服务器才会执行事件:SET GLOBAL event_scheduler = ON;
如果要禁用某个事件,可以使用ALTER EVENT event_name DISABLE;


视图和存储程序安全性(DEFINERINVOKER

默认情况下,用户定义的视图/存储过程/函数的定义者都会是执行CREATE语句的用户账户。而实际执行时,也会按该用户的权限来执行。举个例子,如果我用root定义了一个存储过程对某些表进行删除操作,这时候本来无权进行删除的用户A调用了这个存储过程,那么他同样可以实现删除操作——这显然不是我们希望的。

因此MySQL支持在定义以上程序时加入DEFINERINVOKER信息。单独来说,DEFINER意义并不大,它标识了定义者身份(默认情况下是CURRENT_USER()),但如果需要,可以手动将DEFINER设置为其他值,比如明明是用户root使用CREATE语句,但他可以用DEFINER='A'@'localhost'来设置定义者为用户A。这样执行时讲按A的权限来执行(而不是root)。肯定有人要问,那如果用户A使用CREATE语句定义程序,并且设置DEFINER='root'@'localhost'那岂不是会按root权限执行?答案是:这样的CREATE一般会报错,因为需要对应用户的权限。

来看这样一段存储过程

CREATE DEFINER='xxx'@'localhost'PROCEDURE greetings()BEGIN    SELECT CONCAT('hello,'CURRENT_USER());END;

这时候,无论使用CREATE语句的是谁,结果显示的都是’hello, xxx@localhost’。
要想让每个用户使用自己的身份(权限)来执行程序,需要添加SQL SECURITY INVOKER,如下:

CREATE DEFINER='xxx'@'localhost'PROCEDURE greetings()SQL SECURITY INVOKERBEGIN    SELECT CONCAT('hello,'CURRENT_USER());END;

那么这时,无论xxx写的是谁,最后都会输出当前执行该过程的用户名称,如hello, root@localhost

原创粉丝点击