mysql存儲過程的權限 definer


mysql中用戶對存儲過程的權限有:

ALTER ROUTINE 編輯或刪除存儲過程

CREATE ROUTINE 創建存儲過程

EXECUTE運行存儲過程


存儲過程的創建者擁有存儲過程的ALTER、CREATE、EXECUTE權限。


詳細實驗后續補充。


DEFINER用於指明存儲過程是由哪個用戶定義的,默認存儲過程的定義者是存儲過程,跟存儲過程的使用權限無關。
INVOKER用於指定哪些用戶有調用存儲過程的權限,此時會以調用者的權限去執行存儲過程。
默認情況下被執行的存儲過程具有其創建者的權限,比如用戶A創建了存儲過程P1,用戶B運行存儲過程P1時,只有用戶A有操作權限的數據才能被P1操作。
假設用戶A只有CREATE ROUTINE權限,沒有select、update、delete等權限,正常情況下存儲過程P1不能執行任何操作。如果在創建存儲過程P1時,使用 SQL SECURITY INVOKER特征子句,讓存儲過程使用運行者的權限,這樣即使P1的創建者沒有數據操作權限,P1也可以正常使用。


如果在創建存儲過程時指定為root@%,將有可能導致root@localhost在使用存儲過程時出現權限問題。


相關操作方法:
查看存儲過程的創建語句:

show create procedure 存儲過程名;

查看存儲過程的信息:

show procedure status like '存儲過程名'\G

查看存儲過程的Definer信息:

select db,name,type,definer from mysql.proc where name='存儲過程名' and type='PROCEDURE';

創建存儲過程時指定definer字段:

CREATE
DEFINER = ‘root@localhost’  -- 默認值
PROCEDURE 存儲過程名 ........


測試存儲過程

delimiter $
create procedure p_t1(in id int)
begin
   insert into mysql.t2 values(id,'a');
   select count(*) from mysql.t2;
end
$
delimiter ;


免責聲明!

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



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