萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 存儲過程執行權限詳解:EXECUTE、DEFINER 與 SQL SECURITY

核心權限:EXECUTE

用戶需具備存儲過程所在資料庫的 EXECUTE 權限才能 CALL。

GRANT EXECUTE ON configdb.* TO 'user_test1'@'%';

DEFINER 與 SQL SECURITY 機制

  • DEFINER:創建時指定 CREATE DEFINER='user_admin'@'%' PROCEDURE ...,預設為創建者。
  • SQL SECURITY:
      DEFINER(預設):以定義者權限執行,需定義者具備過程內操作的權限。
      INVOKER:以調用者權限執行,需調用者具備權限。

實戰踩坑記錄

  1. 授予調用者 SELECT,INSERT,UPDATE,DELETE → ERROR 1370: execute command denied → 補 GRANT EXECUTE。
  2. 報 ERROR 1449: The user specified as a definer ... does not exist → 創建 user_admin 用戶。
  3. 報 ERROR 1370: execute command denied to user 'user_admin'@'%' → 定義者也需 EXECUTE 權限。
  4. 報 ERROR 1044: Access denied for user 'user_admin'@'%' to database 'configdb' → 過程內含 CREATE USER, GRANT,定義者需 CREATE USER, GRANT OPTION 等管理權限。

完整授權腳本

-- 調用者
CREATE USER 'user_test1'@'%' IDENTIFIED BY '12345';
GRANT SELECT,INSERT,UPDATE,DELETE,EXECUTE ON configdb.* TO 'user_test1'@'%';
GRANT CREATE TEMPORARY TABLES ON configdb.* TO 'user_test1'@'%';

-- 定義者(存儲過程內執行 DDL/授權需管理權限)
CREATE USER 'user_admin'@'%' IDENTIFIED BY '12345';
GRANT SELECT,INSERT,UPDATE,DELETE,EXECUTE ON configdb.* TO 'user_admin'@'%';
GRANT CREATE USER ON *.* TO 'user_admin'@'%' WITH GRANT OPTION;
GRANT CREATE TEMPORARY TABLES ON configdb.* TO 'user_admin'@'%';

FLUSH PRIVILEGES;

最佳實踐建議

  • 優先使用 SQL SECURITY INVOKER,權限模型清晰,避免定義者權限過大。
  • 若必須用 DEFINER,定義者帳號專用、最小權限、定期審計。
  • 存儲過程內避免 DDL 與授權操作,改由應用層或專門管理腳本執行。
  • 備份/遷移時注意 DEFINER 可能導致還原失敗,可用 sed 替換或 mysqldump --skip-definer。
copyright © 萬盛學電腦網 all rights reserved