用戶需具備存儲過程所在資料庫的 EXECUTE 權限才能 CALL。
GRANT EXECUTE ON configdb.* TO 'user_test1'@'%';
CREATE DEFINER='user_admin'@'%' PROCEDURE ...,預設為創建者。DEFINER(預設):以定義者權限執行,需定義者具備過程內操作的權限。INVOKER:以調用者權限執行,需調用者具備權限。SELECT,INSERT,UPDATE,DELETE → ERROR 1370: execute command denied → 補 GRANT EXECUTE。ERROR 1449: The user specified as a definer ... does not exist → 創建 user_admin 用戶。ERROR 1370: execute command denied to user 'user_admin'@'%' → 定義者也需 EXECUTE 權限。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,定義者帳號專用、最小權限、定期審計。DEFINER 可能導致還原失敗,可用 sed 替換或 mysqldump --skip-definer。