萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 匯入預存程序報錯解決:log_bin_trust_function_creators 與 DELIMITER 詳解

錯誤一:log_bin_trust_function_creators 相關錯誤

匯入預存程序/函數時遇到:

you *might* want to use the less safe log_bin_trust_function_creators variable

原因

啟用二進制日誌(log_bin)時,MySQL 要求建立函數/觸發器的使用者需具備 SUPER 權限,或函數必須宣告為 DETERMINISTIC、NO SQL 或 READS SQL DATA。否則禁止建立,以防主從同步不一致。

解決方案

方法 1:修改配置檔(永久生效,需重啟)

# /etc/my.cnf 或 my.ini
[mysqld]
log_bin_trust_function_creators = 1

方法 2:動態設定(立即生效,重啟失效)

SET GLOBAL log_bin_trust_function_creators = 1;

設定完成後重新匯入即可成功。

錯誤二:DECLARE 語法錯誤 (Error Code: 1064)

匯入預存程序時出現:

Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

原因

預存程序內包含多條 SQL 語句,預設分號 ; 會被 MySQL 客戶端視為語句結束,導致 CREATE PROCEDURE 語句不完整。

解決方案:使用 DELIMITER 重新定義結束符號

DELIMITER //

CREATE PROCEDURE p8()
BEGIN
    DECLARE a INT;
    DECLARE b INT;
    SET a = 5;
    SET b = 5;
    DECLARE cur0 CURSOR FOR SELECT pkid FROM T_VSM_SECPOLICY_USERGROUP;
END//

DELIMITER ;

關鍵點說明

  • DELIMITER //:將語句結束符暫時改為 //
  • 程序體內的分號 ; 不再被視為結束符
  • END//:使用新結束符標記程序結束
  • DELIMITER ;:恢復預設結束符

最佳實踐建議

  1. 建立預存程序/函數腳本時,習慣性在開頭加 DELIMITER //,結尾加 DELIMITER ;
  2. 使用 DETERMINISTIC 或 READS SQL DATA 特性宣告,配合 log_bin_trust_function_creators=0 更安全
  3. 匯出時使用 mysqldump --routines --triggers 確保完整備份
copyright © 萬盛學電腦網 all rights reserved