【存储过程的权限】

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_%';

definer mysql_mysql存储过程的definer和invoker相关推荐

  1. definer mysql_mysql 存储过程中definer和invoker详解

    [存储过程的权限] ALTER ROUTINE 编辑或删除存储过程 CREATE ROUTINE 创建存储过程 EXECUTE运行存储过程 [存储过程的创建语法] delimiter //    -- ...

  2. MySQL 授权用户 ; 存储过程的DEFINER; 命令分隔符DELIMITER

    最近项目中遇到有人使用DEFINER这样的关键字,找了半天没有怎么理解这个意思.以为是限制谁使用这个存储过程,后来测试发现并不是这样. 搜索网上发现很多说法都不正确.看到一篇博客,做了如下介绍,才有所 ...

  3. select 存储过程 mysql_MySQL存储过程无法使用SELECT(基本问题)

    我正在使用一个平台(perfectforms),它要求我在大多数查询中使用存储过程,并且从未使用过存储过程,我无法弄清楚我做错了什么.以下语句执行时没有错误: DELIMITER // DROP PR ...

  4. psid mysql_mysql存储过程

    数据库的存储过程可以减少程序代码的重复性,使程序更加简洁易懂 最近在学习mysql存储过程中遇到了一些有趣的问题: 1.在写存储过程的时候,存储过程名后面一定要加上括号,就算没有参数也要加,不然就会报 ...

  5. KingabseES例程-函数和过程的 INVOKER 与 DEFINER

    调用者权利和定义者权利子句 指定子程序的权利属性.权利属性影响单元在运行时,执行的SQL语句的名称解析和权限检查. PG模式: SECURITY INVOKER SECURITY DEFINER Or ...

  6. mysql 存储过程 invoker invoker

    方法一:修改存储过程的definer update mysql.proc set definer='root@localhost' where db='db_name'; 方法二:修改sql secu ...

  7. definer= 授权_mysql常见问题之视图权限控制--安全性为DEFINER

    概述 前段时间在做数据库备份时提示: mysqldump: Couldn't execute 'SHOW FIELDS FROM `v_ocs_group_production_lines1`': S ...

  8. mysql definer_mysql常见问题之视图权限控制--安全性为DEFINER

    概述 前段时间在做数据库备份时提示: mysqldump: Couldn't execute 'SHOW FIELDS FROM `v_ocs_group_production_lines1`': S ...

  9. mysql如何修改所有的definer

    mysql中的definer是什么,有什么作用? 我们在mysql创建view.trigger.function.procedure.event时都会定义一个Definer='xxx',类似如下: C ...

最新文章

  1. PHP使用curl_multi_add_handle并行处理
  2. Genymotion 模拟器 VirtualBox
  3. idea项目怎么jdk和scala同时显示在External Libraries下?
  4. [POJ1155]TELE
  5. ITK:分段线性曲线的数据结构
  6. 基于hi-nginx的web开发(python篇)——utf-8编码
  7. Android单元测试框架Robolectric3.0介绍(二)
  8. 定时线程_SpringBoot定时任务,@Async多线程异步执行
  9. ORACLE 11G DATA GUARD配置之配置过程
  10. TypeError: softmax() got an unexpected keyword argument 'axis'
  11. 报错:bash: pip: command not found
  12. 大端小端(Big- Endian和Little-Endian)
  13. 需求与商业模式分析-1-商业模式画布
  14. 持续集成之jenkins下载及安装
  15. web 常见的攻击方式
  16. MFC求一元二次方程的根(三种情况:相同根,不同根,虚根)
  17. COB - Chip On Board
  18. AGC004 A - Divide a Cuboid(贪心)
  19. xjax和JQery
  20. amd处理器更新zen4服务器芯片,AMD将推出64 核心Zen 4处理器,整体性能提升了40%...

热门文章

  1. 计算机管理器打开出现找不到文件
  2. pycharm报错:lnvalid Python SDK
  3. Xiaojie雷达之路---拉伸信号处理
  4. pytorch中tensor前面加~
  5. Google Chrome 91.0.4472.124 官方正式版
  6. DAC124S085芯片的使用
  7. 009 - STM32学习笔记 - 中断
  8. CLIQUE算法----子空间聚类算法
  9. Nprogress的配置与使用
  10. web前端培训的未来就业前景怎么样?