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

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

 

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

 

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

 

 

grant select on mysql.proc to usrname@'xxx.xxx.xxx.xxx';app

 

我的简单测试了一下,这样受权后,发现仍是有一些其余问题。测试

 

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能查看不少存储过程的定义,甚至还能查看一些没有访问权限数据库的存储过程的权限。严格意义上来讲,这个受权是不合理,并且是有问题的。spa

 

问题2:MySQL 8.0开始抛弃了mysql.proc,并且从MySQL 8.0开始,若是你要用SHOW CREATE PROCEDURE或SHOW CREATE FUNCION的话,须要有什么权限呢?。code

 

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

 

 

Where are stored procedures stored?ip

 

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”.ci

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功能性的缺陷,短期估计一直存在!

相关文章
相关标签/搜索