MySQL 提供四個函數回傳當前連線的用戶資訊,前三者為同義詞,**CURRENT_USER() 在特定情境下行為不同**,理解差異對權限審計、存儲程序安全定義者模式至關重要。
| 函數 | 官方描述摘要 | 回傳值範例 | 同義詞關係 |
|---|---|---|---|
| USER() | 回傳客戶端連線時提供的用戶名@主機名(utf8 字串) | root@localhostapp_user@192.168.1.50 | **三者完全同義** 可互換使用 |
| SYSTEM_USER() | USER() 的同義詞 | 同上 | |
| SESSION_USER() | USER() 的同義詞 | 同上 | |
| CURRENT_USER() | 回傳**伺服器實際用來認證**的帳號@主機(可能與 USER() 不同),決定權限基準。存儲程序若定義 SQL SECURITY DEFINER,則回傳**定義者**而非呼叫者。 | root@%definer_user@% | 獨立函數 |
CREATE USER 'app'@'%' IDENTIFIED BY 'pwd';mysql -u app -h 192.168.1.10USER() → app@192.168.1.10(實際連線 IP)CURRENT_USER() → app@%(匹配的權限記錄)CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_test`()
SQL SECURITY DEFINER
BEGIN
SELECT USER(), CURRENT_USER();
END;
app@192.168.1.10 呼叫 CALL sp_test()USER() → app@192.168.1.10(呼叫者)CURRENT_USER() → root@localhost(定義者)**用途**:在 DEFINER 程序內執行敏感操作(如寫入審計表)時,用 CURRENT_USER() 記錄實際權限擁有者。
CREATE USER 'proxy_user'@'%' IDENTIFIED WITH mysql_native_password AS '...' REQUIRE SUBJECT '...';USER() 為外部身分,CURRENT_USER() 為映射後的資料庫帳號。| 需求 | 推薦函數 | 理由 |
|---|---|---|
| 審計日誌記錄「誰連線進來」 | USER() | 反映真實客戶端身分與來源 IP |
| 判斷當前執行權限基準 | CURRENT_USER() | 對應 mysql.user 權限記錄,含 DEFINER 切換 |
| 存儲程序內動態 SQL 權限檢查 | CURRENT_USER() | DEFINER 模式下反映定義者權限 |
| 應用層顯示「當前登入用戶」 | USER() | 使用者可辨識的帳號@主機 |
SELECT
USER() AS user_func,
SYSTEM_USER() AS system_user_func,
SESSION_USER() AS session_user_func,
CURRENT_USER() AS current_user_func;
在不同連線方式(本地、遠端、Proxy、存儲程序)執行上述查詢,觀察四欄位差異,即可建立直觀認知。