萬盛學電腦網

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

MySQL 存儲過程匯出匯入完整指南:mysqldump 參數、Trigger 衝突解決、DEFINER 修正與導入錯誤 1418 處理

匯出存儲過程與函數(不含表結構資料)

mysqldump -h localhost -u root -p \
  -n -t -d -R --triggers=false \
  db_name > routines.sql

參數說明:

  • -n / --no-create-db:不含 CREATE DATABASE
  • -t / --no-create-info:不含 CREATE TABLE
  • -d / --no-data:不含資料
  • -R / --routines:導出存儲過程與函數
  • --triggers=false:關鍵,避免 Trigger 導致「multiple triggers 同一事件」錯誤

導入存儲過程

mysql -u root -p db_name < routines.sql

常見導入錯誤與解決

錯誤 1418:函數缺乏 DETERMINISTIC/NO SQL/READS SQL DATA 聲明

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, 
or READS SQL DATA in its declaration and binary logging is enabled

解決:修改 /etc/my.cnf(或 my.ini)

[mysqld]
log_bin_trust_function_creators = 1

重啟 MySQL 或執行 SET GLOBAL log_bin_trust_function_creators = 1;(重啟失效)。

DEFINER 權限問題

匯入後檢查:

SELECT db, created, definer FROM mysql.proc;

若 definer 非 root@localhost(或當前執行用戶),需修正:

UPDATE mysql.proc SET definer = 'root@localhost' WHERE definer != 'root@localhost';
FLUSH PRIVILEGES;

完整存儲過程腳本範本(含 DELIMITER)

DELIMITER $$

CREATE PROCEDURE `pms_authuser`(
    IN account VARCHAR(255), 
    IN vorgid VARCHAR(255)
)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
    DECLARE cnt INT;
    DECLARE pmsc VARCHAR(100);
    
    SELECT orgid INTO pmsc FROM organization WHERE pmscode = vorgid;
    SELECT COUNT(*) INTO cnt FROM userinfo 
    WHERE username = account AND orgid = pmsc;
    
    IF cnt > 0 THEN
        SELECT u.*, o.orgid AS orgdepth 
        FROM userinfo u JOIN organization o ON u.orgid = o.orgid
        WHERE u.username = account AND u.orgid = pmsc;
    ELSE
        SELECT u.*, o.orgdepth
        FROM userinfo u JOIN organization o ON u.orgid = o.orgid
        WHERE u.username = account 
          AND u.orgid IN (SELECT orgid FROM organization WHERE orgdepth LIKE CONCAT('%', pmsc, '%'));
    END IF;
END $$

DELIMITER ;

遠端匯入單行命令

mysql -h remote_host -u root -p db_name < routines.sql

避坑總結

  1. 匯出務必加 --triggers=false。
  2. 啟用 log_bin_trust_function_creators=1 解決 1418 錯誤。
  3. 檢查並修正 DEFINER,避免權限拒絕。
  4. 版控存儲過程腳本,部署前在測試庫驗證。
copyright © 萬盛學電腦網 all rights reserved