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
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;(重啟失效)。
匯入後檢查:
SELECT db, created, definer FROM mysql.proc;
若 definer 非 root@localhost(或當前執行用戶),需修正:
UPDATE mysql.proc SET definer = 'root@localhost' WHERE definer != 'root@localhost';
FLUSH PRIVILEGES;
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
--triggers=false。log_bin_trust_function_creators=1 解決 1418 錯誤。DEFINER,避免權限拒絕。