MySQL能否授予查看存儲過程定義權限給用戶


在其他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> 

 

 

問題3:在MySQL 8.0, 如果用戶test創建存儲過程的時候,指定了DEFINER(沒有指定的不會有這個問題), 然后對於用戶test2,即使授予了ALTER ROUTINE,那么它依然無法查看這些存儲過程定義(網友反饋),如下測試所示:

 

CREATE DEFINER=`test`@`192.168%`  PROCEDURE PRC_TEST1(CNT  INT)
 
BEGIN
 
    DECLARE V_LOOP INT;
 
    SET V_LOOP = CNT;
 
    WHILE V_LOOP>0 DO
 
        INSERT INTO TEST(NAME,CREATE_DATE)  VALUES(REPEAT('A',800),DATE_ADD(NOW(),INTERVAL -RAND()*100000 MINUTE) );
 
        SET V_LOOP = V_LOOP - 1;
 
    END WHILE;
 
END

 

test2用戶,使用命令SHOW CREATE PROCEDURE PRC_TEST1查看存儲過程定義為NULL也就是說即使授予了ALTER ROUTINE權限但是如果存儲過程有指定DEFINER這樣依然無法看到存儲過程的定義

 

clip_image001

 

mysql> show grants for test2@'192.168%';
+-------------------------------------------------------------------------------+
| Grants for test2@192.168%                                                     |
+-------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `test2`@`192.168%`                                      |
| GRANT SELECT, CREATE ROUTINE, ALTER ROUTINE ON `MyDB`.* TO `test2`@`192.168%` |
+-------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

 

總結:

   在MySQL5.7或之前版本,可以通過授予用戶查詢mysql.proc來間接實現查看存儲過程定義的權限,在MySQL 8.0 可以通過授予用ALTER ROUTINE的權限來間接實現查看存儲過程定義的權限(如果存儲過程有指定DEFINER,此方法無效),兩者都有一個問題,那就是會放大權限,這個屬於MySQL功能性的缺陷,短時間估計一直存在!其實對於MySQL的存儲過程,目前來說只有三種權限,而沒有其它數據庫VIEW DEFINITION之類的權限:

 

    ALTER ROUTINE   編輯或刪除存儲過程

    CREATE ROUTINE  創建存儲過程

    EXECUTE         運行存儲過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM