首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 建立函數報錯 1227/1418 完整解決:權限、binlog 信任與 DETERMINISTIC 聲明

     編輯:MySQL 資料庫相關知識

MySQL CREATE FUNCTION 常見三大報錯:權限不足 (1227)、binlog 信任未開啟 (1418)、缺少 DETERMINISTIC 聲明。本文提供三大案例完整排查與解決方案。

案例一:ERROR 1227 - 權限不足 (DEFINER 問題)

錯誤現象

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 權限。

解決

  1. 移除 DEFINER 子句 (由當前用戶自動成為定義者)
  2. 或授予 SUPER 權限:GRANT SUPER ON *.* TO 'current_user'@'%';
  3. 或以指定 DEFINER 用戶登入執行

案例二:ERROR 1418 - binlog 信任未開啟

錯誤現象

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 ;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved