阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL能否授予查看存储过程定义权限给用户

157次阅读
没有评论

共计 2212 个字符,预计需要花费 6 分钟才能阅读完成。

在其他 RDBMS 中,可以将查看某个存储过程(PROCEDURE)定义的权限给某个用户,例如在 SQL Server 中,可以单独将查看 ProcedureName 定义的权限授予 UserA

GRANT VIEW DEFINITION ON ProcedureName TO UserA; – 用具体的存储过程名和账号替换

那么在 MySQL 中能否实现这个功能呢?找了很多资料,没有看到有这方面的功能,官方文档没有涉及这样的权限,网上有个方法:可以通过授予用户查询 mysql.proc 这样的权限来间接实现这个功能

grant select on mysql.proc to usrname@’xxx.xxx.xxx.xxx’;

个人简单测试了一下,这样授权后,发现还是有一些其他问题。

mysql> show create procedure prc_insert;  – 没有授权前报这个错误。
ERROR 1305 (42000): PROCEDURE prc_insert does not exist
mysql> show create procedure prc_insert\G; – 授权后
*************************** 1. row ***************************
          Procedure: prc_insert
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_insert`(in  cnt int)
begin
declare i int;
set i=1;
while i < cnt do
    insert into test(id, name) select i,  CONCAT(‘name’,i) from dual;
   
    set i = i+1;
 
end while;
end
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)
 
ERROR:
No query specified

问题 1:这样授权后,你能看到所有数据库存储过程的定义(不仅仅是某个某个存储过程,或某个数据库的存储过程的定义),这里就涉及一个权限放大的问题。例如,我本来打算只授予用户 A 查看存储过程 PRC_A 的定义权限,但是那样授权后,A 能查看很多存储过程的定义,甚至还能查看一些没有访问权限数据库的存储过程的权限。严格意义上来说,这个授权是不合理,而且是有问题的。

问题 2:MySQL 8.0 开始抛弃了 mysql.proc,而且从 MySQL 8.0 开始,如果你要用 SHOW CREATE PROCEDURE 或 SHOW CREATE FUNCION 的话,需要有什么权限呢?。

MySQL 8.0 开始,存储过程存储在 mysql.routines 和 mysql.parameters 系统表中,但是这些表无法直接访问,只能访问 INFORMATION_SCHEMA.ROUTINES。像 MySQL 8.0 之前那样授权行不通了,

Where are stored procedures stored?

Stored procedures are stored in the mysql.routines and mysql.parameters tables, which are part of the data dictionary. You cannot access these tables directly. Instead, query the INFORMATION_SCHEMA ROUTINES and PARAMETERS tables. See Section 25.29,“The INFORMATION_SCHEMA ROUTINES Table”, and Section 25.19,“The INFORMATION_SCHEMA PARAMETERS Table”.

You can also use SHOW CREATE FUNCTION to obtain information about stored functions, and SHOW CREATE PROCEDURE to obtain information about stored procedures. See Section 13.7.7.9,“SHOW CREATE PROCEDURE Statement”.

个人测试发现,授予 alter routine 后,就能查看存储过程的定义,但是这个授权也带来一个问题,授予权限的用户不仅可以查看存储过程定义,而且可以删除这个存储过程(这个也是一个问题)。这个当然,不清楚是否还有其它授权来实现。

mysql> grant alter routine on procedure MyDB.prc_2 TO test@’192.168%’;
Query OK, 0 rows affected (0.08 sec)
mysql>

总结:

在 MySQL5.7 或之前版本,可以通过授予用户查询 mysql.proc 来间接实现查看存储过程定义的权限,在 MySQL 8.0 可以通过授予用 ALTER ROUTINE 的权限来间接实现查看存储过程定义的权限,两者都有一个问题,那就是会放大权限,这个属于 MySQL 功能性的缺陷,短时间估计一直存在!

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2212字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中