具體錯誤:
使用mysql建立、調用存儲過程,函數以及觸發器的時候會有錯誤符號爲1418錯誤。mysql
[Err] 1418 - 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)sql
查閱相關資料,意思是說binlog啓用時,建立的函數沒有聲明類型,由於binlog在主從複製須要知道這個函數建立語句是什麼類型,不然同步數據會有不一致現象。服務器
mysql開啓了bin-log, 咱們就必須指定咱們的函數是不是哪一種類型:
1 DETERMINISTIC 不肯定的
2 NO SQL 沒有SQl語句,固然也不會修改數據
3 READS SQL DATA 只是讀取數據,固然也不會修改數據
4 MODIFIES SQL DATA 要修改數據
5 CONTAINS SQL 包含了SQL語句less
爲了解決這個問題,MySQL強制要求:
在主服務器上,除非子程序被聲明爲肯定性的或者不更改數據,不然建立或者替換子程序將被拒絕。這意味着當建立一個子程序的時候,必需要麼聲明它是肯定性的,要麼它不改變數據。函數
聲明方式有兩種:
第一種:聲明是不是肯定性的
DETERMINISTIC和NOT DETERMINISTIC指出一個子程序是否對給定的輸入老是產生一樣的結果。
若是沒有給定任一特徵,默認是NOT DETERMINISTIC,因此必須明確指定DETERMINISTIC來聲明一個子程序是肯定性的。
這裏要說明的是:使用NOW() 函數(或它的同義)或者RAND() 函數不會使一個子程序變成非肯定性的。對NOW()而言,二進制日誌包括時間戳並會被正確的執行。RAND()只要在一個子程序內被調用一次也能夠被正確的複製。因此,能夠認爲時間戳和隨機數種子是子程序的肯定性輸入,它們在主服務器和從服務器上是同樣的。
第二種:聲明是否會改變數據
CONTAINS SQL, NO SQL, READS SQL DATA, MODIFIES SQL用來指出子程序是讀仍是寫數據的。
不管NO SQL仍是READS SQL DATA都指出,子程序沒有改變數據,可是必須明確地指定其中一個,由於若是任何指定,默認的指定是CONTAINS SQL。
默認狀況下,若是容許CREATE PROCEDURE 或CREATE FUNCTION 語句被接受,就必須明確地指定DETERMINISTIC 或 NO SQL與READS SQL DATA 中的一個,不然就會產生1418錯誤。日誌
解決辦法也有兩種:
第一種是在建立子程序(存儲過程、函數、觸發器)時,聲明爲DETERMINISTIC或NO SQL與READS SQL DATA中的一個,
例如:rem
DROP FUNCTION IF EXISTS `t_auto_increment`;
DELIMITER ;;
CREATE FUNCTION `t_auto_increment`(`seq_name` tinyint) RETURNS varchar(50) CHARSET utf8
DETERMINISTIC
BEGIN
declare v_prefix VARCHAR(20);
update t_auto_increment a set a.currentvalue=LAST_INSERT_ID(a.currentvalue+a.incrementBy) where a.autoKey=seq_name;
select prefix into v_prefix from t_auto_increment where autoKey=seq_name;
RETURN CONCAT(CASE WHEN v_prefix is null THEN '' ELSE v_prefix END,LAST_INSERT_ID());
END
;;
DELIMITER ;同步
第二種是信任子程序的建立者,禁止建立、修改子程序時對SUPER權限的要求,設置log_bin_trust_routine_creators全局系統變量爲1。設置方法有三種:it
1.在客戶端上執行SET GLOBAL log_bin_trust_function_creators = 1;
2.MySQL啓動時,加上--log-bin-trust-function-creators選賢,參數設置爲1
3.在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1
io