天天看點

Mysql修改存儲過程相關權限問題

   在使用mysql資料庫經常都會遇到這麼一個問題,其它使用者定義的存儲過程,現在使用另一個使用者卻無法修改或者删除等;正常情況下存儲過程的定義者對它有修改、删除的權限;但是其它的使用者就要相于的授權,不然無法檢視、調用;

    mysql 中使用使用者A建立一個存儲過程,現在想通過另一個使用者B來修改A建立的存儲過程;以下記錄就是基于這樣的情況産生的;

Mysql修改存儲過程相關權限問題

使用者A對OTO3庫的權限:

使用者B的權限:

以使用者B的身份登陸Mysql操作;

查存儲過程清單時就提示沒有權限了:

以root身份給B使用者添加一個檢視存儲過程的權限:

再回到B使用者裡檢視存儲過程清單:

此時發現多了一個mysql庫,但隻有對mysql.proc有查詢權限:

mysql庫中隻有一個表:proc

同樣也可以看到存儲過程的詳細資訊:

嘗試修改存儲過程的配置:

為了友善檢視在Navicat工具上嘗試修改存儲過程,在儲存的時候報如下權限問題:

嘗試添加一個存儲過程,報權限資訊:

#這裡表示b使用者沒有對OTO3有授權存儲過程的修改權限;

以B使用者嘗試調用一下存儲過程:

#這裡很明顯連運作權限也沒有;

嘗試删除原有的a使用者定義的存儲過程,也會報權限資訊,如下:

可以看出B使用者連調用存儲過程的權限都沒有,這裡先加入執行權限:

接下來添加一個執行存儲過程的權限:

再次執行一下存儲過程,發現成功了;

時間: 0.080ms

Procedure executed successfully

受影響的行: 0

那再添加一下建立添加存儲過程的權限:

上面添權重限後就可以建立存儲過程了;

但是自己建立的都無法删除;

接下來再添加一個修改的權限,也可以删除的哦;

上面添加完alter ROUTINE權限後就可以對OTO3所有的存儲過程有删除權限[自己定義的增、删、改],别人定義的可以删除,但是還不能修改;修改别人定義的存儲過程會有如下提示:

這裡說明一下這個SUPER權限在哪裡?通過檢視使用者權限原來在這裡:

嘗試添加一下這個SUPER權限看看:

不能對指定的庫執行這個權限,因為SUPER為全局的就是整個mysql的權限;

再次檢查時會發現 Super_priv: Y 變化了;再修改一下别人定義的存儲過程;

檢視所有資料庫,發現mysql庫隻有一張proc表有讀取的權限,SUPER并非我所想象中那麼強大;

仔細觀看會發現執行語句:

可以看到有   Create_routine_priv: N和 Alter_routine_priv: N 這兩個明顯就是對存儲過程的權限嘛,能不能不用SUPER而使用這兩個權限呢?

回收一下這個SUPER權限;

再添加Alter_routine_priv,Create_routine_priv

發現還是報相同的權限問題:

執行上面權限後發現,可以看到其它的系統庫:[例如sys庫也有存儲過程,由于這兩個權限是全局的]

這兩個權限更大,連系統庫sys中的存儲過程都能看到,甚至修改删除,非常危險;決定再次回收權限create routine,alter routine;

還是使用SUPER權限比較安全;

通過上面的測試得出以下結論:

1、檢視存儲過程權限:SELECT  #是對mysql.proc表的權限;

2、執行存儲過程權限:EXECUTE   #是對指定資料庫的權限;

3、建立存儲過程權限:CREATE ROUTINE #是對指定資料庫的權限;

4、修改存儲過程權限:ALTER ROUTINE  #是對指定資料庫的中自己定義的存儲過程;

5、修改别人定義的存儲過程權限:SUPER  #是對全局整個mysql的權限;

簡來說使用者A在資料庫OTO3中定義了一個存儲過程,現在想用使用者B來執行、修改存儲過程,需要對使用者B添加以下權限:

是以使用者B的最基本的權限:

至此,對于Mysql中以另的使用者修改其它人定義的存儲過程權限也就非常的顯白了;

如果不是以另一個使用者身份調用存儲過程,可以使用root權限修改存儲過程的定義者; 這樣就等于linux裡的所有者權限變更了;

update mysql.proc set DEFINER='b'@'%' WHERE NAME='proc_cs' AND db='OTO3'; 

本文轉自yunlielai51CTO部落格,原文連結:http://blog.51cto.com/4925054/1979313,如需轉載請自行聯系原作者