在其他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_insertsql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `prc_insert`(in cnt int)
begindeclare i int;
set i=1;while i < cnt doinsert into test(id, name) select i, CONCAT('name',i) from dual;
set i = i+1;end while;
endcharacter_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)
BEGINDECLARE V_LOOP INT;
SET V_LOOP = CNT; WHILE V_LOOP>0 DOINSERT 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,這樣依然無法看到存盤程序的定義

mysql> show grants for test2@'192.168%';
+-------------------------------------------------------------------------------+
| Grants for [email protected]% |
+-------------------------------------------------------------------------------+
| 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 運行存盤程序
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/107766.html
標籤:MySQL
