當導入包含 DEFINER=`root`@`%` 的視圖、存儲過程、觸發器或事件的 SQL 腳本時,若目標數據庫不存在該用戶或主機匹配,MySQL 會拋出此錯誤。本文提供三種針對性解決方案,並解析 DEFINER 機制與安全最佳實踐。
-- 登錄 MySQL 管理員賬號 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password'; mysql> FLUSH PRIVILEGES;
適用場景:目標庫確實需要 `root@%` 遠程訪問權限。風險:開放 `%` 主機降低安全性,生產環境慎用。
ALTER PROCEDURE `proc_name` DEFINER = 'root'@'localhost' SQL SECURITY DEFINER ...
ALTER EVENT `event_name` DEFINER = 'root'@'localhost' ...
導出時使用 mysqldump 參數移除 DEFINER:
sed -i "s/DEFINER=\`root\`@\`%\`/DEFINER=\`root\`@\`localhost\`/g" dump.sql
| 特性 | 說明 |
|---|---|
| 定義者 | 創建對象時的 CURRENT_USER,格式 'user'@'host' |
| SQL SECURITY | DEFINER(默認,按定義者權限執行)| INVOKER(按調用者權限執行) |
| 權限檢查 | 執行時驗證定義者是否擁有對象操作所需權限 |
| 超級權限 | 擁有 SUPER 權限的用戶可指定任意 DEFINER |
'app_user'@'localhost' 或 'app_user'@'10.0.%'SELECT * FROM information_schema.VIEWS WHERE DEFINER LIKE '%root%'; 排查高風險對象