1. 程式人生 > >mysql stored routine (存儲例程) 中 definer 的作用 和實例

mysql stored routine (存儲例程) 中 definer 的作用 和實例

root http pac 執行 指定 all word err cti

創建 例程語法參見https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html

創建procedure 的語法如下

CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
definer 的作用是進行一個權限的控制 只有super 權限或者 指定的 procedure 創建者 才能執行這個procedure
只有super 用戶才能使用definer 語法

創建一個簡單的實例 我是在root@localhost 下面創建的

mysql> delimiter #

mysql> CREATE DEFINER=`hee`@`localhost` PROCEDURE `simpleproc`(OUT param1 INT)
    begin select count(*) INTO param1 from `categories`;  
end #
mysql> delimiter ;

#調用的時候直接

mysql> call simpleproc(@a);
mysql> select @a;
+------+
| @a   |
+------+
|    6 |
+------+
1 row in set (0.00 sec)

現在我切換到 hee@localhost

本應該 我執行 simpleproc 就可以的 因為當前用戶就是hee@localhost 但是仍然失敗 代碼如下

#我先創建了 hee@localhost 用戶 【在root@localhost 下面 創建】
mysql> create user hee@localhost identified by "abc";

#在給了一部分權限給hee@localhost
grant insert,update,select on `api_db`.`categories` to hee@localhost;

# 為什麽我沒有直接給ALL PRIVILEGES 給 hee@localhost 是因為 不是所有的情況都可以給all privileges 我旨在說明 執行 procedure 的權限


# 切換到 hee@localhost

mysql> call simpleproc(@a);
ERROR 1370 (42000): execute command denied to user ‘hee‘@‘localhost‘ for routine ‘api_db.simpleproc‘
mysql> select CURRENT_USER;
+---------------+
| CURRENT_USER  |
+---------------+
| hee@localhost |
+---------------+
1 row in set (0.00 sec)

為啥不能執行simpleproc ?

因為在還需要另外的權限

參考 grant 權限列表 https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute

摘抄

The EXECUTE privilege is required to execute stored routines (procedures and functions). 要執行 procedure 必須擁有execute 權限 這個可以再 mysql.user 表格中查看

EXECUTE 是加載在一個database 上面的 所以 要授權使用

mysql> grant EXECUTE on `api_db`.* to hee@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

但是 還是在另外一個終端 (hee@localhost 登陸的終端) 還是執行 call simpleproc(@a) 失敗 只要重新登錄mysql一下就可以了

mysql> call simpleproc1(@a) ;
Query OK, 1 row affected (0.00 sec)

mysql> select @a
    -> ;
+------+
| @a   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql stored routine (存儲例程) 中 definer 的作用 和實例