博客
关于我
【MySQL】MySQL视图定义者和安全性definer/invoker
阅读量:327 次
发布时间:2019-03-03

本文共 1921 字,大约阅读时间需要 6 分钟。

一、问题背景

做MySQL数据库用户权限规范的时候,将原来业务帐号'user'@'%'修改为'user'@'192.168.1.%'时,忽然发现业务系统部分业务报404错误,经排查,发现是因为报错的业务在调用数据库时,使用了视图,而视图的定义者是原来的'user'@'%',并且安全性设置的是definer,现在这个用户不存在了,虽然新用户'user'@'192.168.1.%’拥有和原来相同的数据库权限,但是依然不能使用这些视图。

原因找到了,那么解决办法也就出来了:

一是将所有视图的定义者修改为'user'@'192.168.1.%';

二是将安全性定义由definer设置为invoker。

因为是生产环境,不能随便搞,所以采用的是第一种方法,第二种方法没有再试。

 

二、definer和invoker的区别

 

在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行。

definer:  由definer(定义者)指定的用户的权限来执行

invoker: 由调用这个视图(存储过程)的用户的权限来执行

 

definer

当定义为DEFINER时,必须数据库中存在DEFINER指定的用户,并且该用户拥有对应的操作权限,才能成功执行,与当前用户是否有权限无关。

invoker

当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。

 

三、MySQL中的definer是什么,有什么作用?

 

我们在MySQL创建view、trigger、function、procedure、event时都会定义一个Definer='XXX'

 

加红的部分SQL SECURITY 其实后面有两个选项,一个为DEFINER,一个为INVOKER

SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。

DEFINER 表示按定义者拥有的权限来执行

INVOKER 表示用调用者的权限来执行

默认情况下,系统指定为DEFINER 

 

以存储过程为例:

(1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户;

(2)如果SQL SECURITY子句指定为DEFINER,存储过程将使用存储过程的DEFINER执行存储过程,验证调用存储过程的用户是否具有存储过程的execute权限和DEFINER用户是否具有存储过程引用的相关对象的权限;

(3)如果SQL SECURITY子句指定为INVOKER,那么MySQL将使用当前调用存储过程的用户执行此过程,并验证用户是否具有存储过程的execute权限和存储过程引用的相关对象的权限;

(4)如果不显示的指定SQL SECURITY子句,MySQL默认将以DEFINER执行存储过程。

 

我们来看下面几个小例子。

用root帐号登陆

 

你会发现系统报错查询不到了,这是因为我们在上述定义的SQL SECURITY值为INVOKER,存储过程执行过程中会以user1具有的权限来执行,其中调用到了mysql的库,而我们的user1帐户只有testdb库的使用权限,所以会返回失败。

 

我们把上面的invoker改为definer再来试一下

 

发现可以查询出来了,因为user1对存储过程user_count有执行的权限,虽然它依旧没有权限直接操作mysql库,由于我们定义的SQL SECURITY为DEFINER,所以在执行时是以root的身份执行的,所以可以正常查询出来。

 

现在在MySQL涉及的definer有view、trigger、function、procedure、event。

 

一般前期在测试库上开发的缘故,我们经常定义到的definer为`root`@`%`,安全整改,使用其他普通用户,务必要批量修改相关view、trigger、function、procedure、event的definer,否则到出现服务不可用!

 

四、参考

 

MySQL视图定义者和安全性definer/invoker

https://pdf.us/2018/02/24/679.html

 

MySQL如何修改所有的definer?

https://www.cnblogs.com/zejin2008/p/4767531.html

 

MySQL error 1449: The user specified as a definer does not exist

https://www.jianshu.com/p/43153801d2af

 

 

你可能感兴趣的文章
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>
MYSQL中 find_in_set() 函数用法详解
查看>>