文档章节

mysql存储过程的definer和invoker

辰月
 辰月
发布于 2015/07/29 13:19
字数 924
阅读 764
收藏 0

【存储过程的权限】

ALTER ROUTINE 编辑或删除存储过程

CREATE ROUTINE 创建存储过程

EXECUTE运行存储过程


【存储过程的创建语法】

delimiter //    -- 声明分隔符(命令结束符)

create 

 definer = user@hostname | current_user 

 procedure 存储过程名 (参数)

 comment '注释'

 sql security definer | invoker   -- sql 的安全设置

begin

  存储过程的body

end

//

delimiter ;    -- 声明分隔符(命令结束符)


【函数的创建语句】

delimiter //    -- 声明分隔符(命令结束符)

create

 definer = user@hostname | current_user

 function 函数名(参数)

 return 返回值类型

 comment '注释'

 sql security definer | invoker   -- sql 的安全设置

begin

  函数的body

end


//

delimiter ;    -- 声明分隔符(命令结束符)


【definer和invoker的解释】

    创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来奉告mysql在执行存储过程的时候,,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。

   默认情况下,使用DEFINER方式,此时调用存储过程的用户必须有存储过程的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。

   DEFINER模式下,默认DEFINER=CURRENT_USER,在存储过程执行时,mysql会检查DEFINER定义的用户'user_name'@'host_name'的权限;

   INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限。


  案例一:DEFINER

   CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()

   BEGIN

       SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;

   END;

   在这个案例中,不论哪个用户A调用存储过程,存储过程都会以'admin'@'localhost'的权限去执行,即使这个用户A没有查询mysql.user表的权限。


 案例二:INVOKER

   CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()

       SQL SECURITY INVOKER

   BEGIN

       SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;

   END;

   在这个案例中,虽然存储过程语句中仍然带有DEFINER参数,但是由于SQL SECURITY指定了INVOKER,所以在存储过程执行的时候,会以调用者的额身份去执行。此时这个存储过程是否能成功执行,取决于调用者是否有mysql.user表的查询权限。


【案例】

案例一:调用存储过程

 存储过程的调用者是 : admin@192.168.1.1

 存储过程的DEFINER是   : admin@%

 MySQL中存在的用户是 : admin@192.168.%.%


   此时admin@192.168.1.1是可以访问数据库的,因为它符合admin@192.168.%.%的授权规则,但是当它调用DEFINER='admin@%'的存储过程的时候,mysql会检查mysql.user用户表中是否存在admin@%这个用户,mysql的检查结果是admin@%这个用户不存在,此时就会返回报错,提示“Ther user specified as a definer ('admin@%') does not exist.。

 

案例二:创建存储过程


 使用用户admin@192.168.1.1连接mysql,该用户有test库的all privileges,执行创建存储过程的操作:

         存储过程中定义的DEFINER是   : admin@%

         MySQL中存在的用户是 : admin@192.168.%.%

 此时,会遇到报错,提示”ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation“

 修复DEFINER='admin@192.168.%.%',或者去掉 DEFINER参数,都可以恢复正常。


说明:

   案例一中是存在问题的,存储过程的调用者和拥有者都是admin@192.168.1.1,但是DEFINER却是admin@%,这是由于创建存储过程的命令是由root用户执行的,所以没有遇到案例二中的报错。


【存储过程常用命令】


查看存储过程的创建语句:

show create procedure 存储过程名;

查看存储过程的信息:

show procedure status like '存储过程名'G

查看存储过程的Definer信息:

select db,name,type,sql_security,definer from mysql.proc where  type='PROCEDURE' and db='数据库名' ;

修改存储过程的DEFINER:

update  mysql.proc  set `definer` ='admin@192.168.%.%' where db like 'db_%';


本文转载自:

辰月
粉丝 0
博文 29
码字总数 2473
作品 0
武汉
私信 提问
Mysql存储过程 一次插入一批数据 或成千条数据 mysql循环语句

Mysql使用存储过程,插入一批数据,可以插入上千条数据,只要使用循环语句,就行了。 Mysql(5.0以上版本)在SQLyog(版本是8.32)里如何建立存储过程: 1, 打开SQLyog工具。 2, 建立表pro...

Carl_
2014/11/14
783
0
MySQL数据库的常用命令语句记录——存储过程语句

CREATE EVENT 创建执行事件 CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE]--当完成事件时,服务器是......

无聊书生
2015/08/24
86
0
mysql视图/存储过程/函数/事件/触发器

--语法参考:https://dev.mysql.com/doc/ (当前用的是5.6) https://dev.mysql.com/doc/refman/5.6/en/sql-syntax-data-manipulation.html --视图 CREATE VIEW test.v AS SELECT * FROM t;......

坦途abc
2018/07/19
15
0
mysql 常见错误解决方式

mysql 1449 : The user specified as a definer ('root'@'%') does not exist 分析: 一般是由于root用户对全局host无访问权限。因此只要给root用户添加一个访问权限即可。 解决方式: grant......

leon_tan
2015/09/07
68
0
8、MySLQ存储过程

简述 存储过程是SQL语句和控制流语句的语句串(语句集合)。它不仅可以带有输入 参数还可以带有输出参数,存储过程是能够通过介绍参数向调用者返回结果集,结果集的格式由调用者确定。返回状...

CARYFLASH
2017/11/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
11
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
8
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部