| 关键词: 过程 存储 权限 函数 用户 definer 27 赋权 ROUTINE 子句 |
概述分享一个比较神奇的现象,是我们的开发人员在开发环境因为不规范操作发现的,后来研究了一下是mysql权限控制方面的问题,下面分享一下这个问题的解决过程。 问题问题:用root用户在数据库lcpdb创建函数getUnitChildList可以看到函数内容,但是普通用户账号只能看到函数存在,看不到函数内容,无法修改,且无法调用。而且,普通账号可以删除这些存储过程并重建。 ![]() ![]() 下面介绍下排查时的思路: 1、查看权限![]() 有大佬说这个问题是由于是赋权是采用 all privileges的方式进行赋权的,这种赋权方式,是没有函数等存储过程使用的权限。需要重新给普通用户赋权。因为我们授权刚好是使用这种方式,还是挺符合的。 定义该存储过程还需要有CREATE ROUTINE的权限、更改存储过程需要有ALTER ROUTINE的权限(这里是用超级用户在lcpdb创建的存储过程,上述权限都是具备的),调用存储过程的用户需要有EXECUTE权限,最终执行存储过程的用户也即存储过程定义者要具备存储过程定义语句中相关的各种权限。 2、重新授权alter routine---修改与删除存储过程/函数 create routine--创建存储过程/函数 execute--调用存储过程/函数 grant execute on lcpdb.* to 'fsl'@'%' 授权后查看函数还是不行,之所以在命令行操作是考虑有可能在navicat看不到,但是命令行可以看到的情况。 ![]() 3、考虑definer在mysql创建view、trigger、function、procedure、event时都会定义一个Definer=‘xxx’ SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。DEFINER 表示按定义者拥有的权限来执行 INVOKER 表示用调用者的权限来执行。默认情况下,系统指定为DEFINER 以存储过程为例: (1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户; 这里执行命令: grant all privileges on mysql.* to 'fsl'@'%' 可以查询select * from mysql.proc来查看权限。 ![]() 到这里问题就解决了。 这里按数据库管理规范还是建议root只做权限方面的控制,不同数据库用不同用户来管理,不要用root来直接创建函数,这样也就不会有这种情况发生啦! 后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~ ![]() |
| 本文出处: https://www.toutiao.com/a6685700131469132295/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|