mysql儲存過程的許可權 definer

weixin_34262482發表於2014-04-19

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 ;

相關文章