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

相關文章
相關標籤/搜索