MySQL CREATE FUNCTION 常見三大報錯:權限不足 (1227)、binlog 信任未開啟 (1418)、缺少 DETERMINISTIC 聲明。本文提供三大案例完整排查與解決方案。
Error Code: 1227. Access denied; you need (at least one of) the SUPER privilege(s) for this operation
SQL 含 CREATE DEFINER=`devop`@`%` FUNCTION ...,但當前用戶非 devop 或無 SUPER 權限。
GRANT SUPER ON *.* TO 'current_user'@'%';ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
啟用 binlog 時,函數必須聲明確定性特性,或開啟 log_bin_trust_function_creators。
SET GLOBAL log_bin_trust_function_creators = 1; -- 永久生效加入 my.cnf [mysqld] log_bin_trust_function_creators = 1
⚠️ 主從架構需**主從同步開啟**,否則從庫同步失敗。
CREATE FUNCTION my_func(...) RETURNS INT DETERMINISTIC -- 相同輸入必得相同輸出 -- 或 NO SQL / READS SQL DATA / MODIFIES SQL DATA BEGIN ... END;
-- 主庫開啟後,從庫必須同步操作 -- 從庫: STOP SLAVE; SET GLOBAL log_bin_trust_function_creators = 1; START SLAVE;
| 特性 | 含義 | 適用場景 |
|---|---|---|
| DETERMINISTIC | 相同輸入確定相同輸出 | 純計算、字串處理、無副作用 |
| NO SQL | 不包含 SQL 語句 | 純邏輯運算 |
| READS SQL DATA | 讀取資料但不修改 | 查詢封裝函數 |
| MODIFIES SQL DATA | 修改資料 (INSERT/UPDATE/DELETE) | 資料操作封裝 (需謹慎) |
DROP FUNCTION IF EXISTS `nextval`; DELIMITER ;; CREATE FUNCTION `nextval`(`seq_name` VARCHAR(50)) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE seq_max BIGINT(20); UPDATE sequenceconftable SET `max` = `max` + 1 WHERE NAME = seq_name; SELECT `max` INTO seq_max FROM sequenceconftable WHERE NAME = seq_name; RETURN seq_max; END ;; DELIMITER ;