MySql笔记(存储过程)

存储过程是使用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 INVOKER
BEGIN
    SELECT CONCAT('hello,'CURRENT_USER());
END;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值