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 ;