definer mysql_mysql存储过程的definer和invoker
【存储过程的权限】
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相关推荐
- definer mysql_mysql 存储过程中definer和invoker详解
[存储过程的权限] ALTER ROUTINE 编辑或删除存储过程 CREATE ROUTINE 创建存储过程 EXECUTE运行存储过程 [存储过程的创建语法] delimiter // -- ...
- MySQL 授权用户 ; 存储过程的DEFINER; 命令分隔符DELIMITER
最近项目中遇到有人使用DEFINER这样的关键字,找了半天没有怎么理解这个意思.以为是限制谁使用这个存储过程,后来测试发现并不是这样. 搜索网上发现很多说法都不正确.看到一篇博客,做了如下介绍,才有所 ...
- select 存储过程 mysql_MySQL存储过程无法使用SELECT(基本问题)
我正在使用一个平台(perfectforms),它要求我在大多数查询中使用存储过程,并且从未使用过存储过程,我无法弄清楚我做错了什么.以下语句执行时没有错误: DELIMITER // DROP PR ...
- psid mysql_mysql存储过程
数据库的存储过程可以减少程序代码的重复性,使程序更加简洁易懂 最近在学习mysql存储过程中遇到了一些有趣的问题: 1.在写存储过程的时候,存储过程名后面一定要加上括号,就算没有参数也要加,不然就会报 ...
- KingabseES例程-函数和过程的 INVOKER 与 DEFINER
调用者权利和定义者权利子句 指定子程序的权利属性.权利属性影响单元在运行时,执行的SQL语句的名称解析和权限检查. PG模式: SECURITY INVOKER SECURITY DEFINER Or ...
- mysql 存储过程 invoker invoker
方法一:修改存储过程的definer update mysql.proc set definer='root@localhost' where db='db_name'; 方法二:修改sql secu ...
- definer= 授权_mysql常见问题之视图权限控制--安全性为DEFINER
概述 前段时间在做数据库备份时提示: mysqldump: Couldn't execute 'SHOW FIELDS FROM `v_ocs_group_production_lines1`': S ...
- mysql definer_mysql常见问题之视图权限控制--安全性为DEFINER
概述 前段时间在做数据库备份时提示: mysqldump: Couldn't execute 'SHOW FIELDS FROM `v_ocs_group_production_lines1`': S ...
- mysql如何修改所有的definer
mysql中的definer是什么,有什么作用? 我们在mysql创建view.trigger.function.procedure.event时都会定义一个Definer='xxx',类似如下: C ...
最新文章
- PHP使用curl_multi_add_handle并行处理
- Genymotion 模拟器 VirtualBox
- idea项目怎么jdk和scala同时显示在External Libraries下?
- [POJ1155]TELE
- ITK:分段线性曲线的数据结构
- 基于hi-nginx的web开发(python篇)——utf-8编码
- Android单元测试框架Robolectric3.0介绍(二)
- 定时线程_SpringBoot定时任务,@Async多线程异步执行
- ORACLE 11G DATA GUARD配置之配置过程
- TypeError: softmax() got an unexpected keyword argument 'axis'
- 报错:bash: pip: command not found
- 大端小端(Big- Endian和Little-Endian)
- 需求与商业模式分析-1-商业模式画布
- 持续集成之jenkins下载及安装
- web 常见的攻击方式
- MFC求一元二次方程的根(三种情况:相同根,不同根,虚根)
- COB - Chip On Board
- AGC004 A - Divide a Cuboid(贪心)
- xjax和JQery
- amd处理器更新zen4服务器芯片,AMD将推出64 核心Zen 4处理器,整体性能提升了40%...