天天看點

mysql function 參數預設值_MySQL參數log_bin_trust_function_creators

問題:執行建立函數的sql檔案報錯如下;

[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)

解決辦法也有兩種, 第一種是在建立子程式(存儲過程、函數、觸發器)時,聲明為DETERMINISTIC或NO SQL與READS SQL DATA中的一個,

例如: CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()

DETERMINISTIC BEGIN #Routine body goes here... END;;

第二種是信任子程式的建立者,禁止建立、修改子程式時對SUPER權限的要求,設定log_bin_trust_routine_creators全局系統變量為1。

設定方法有三種:

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

官方文檔對參數log_bin_trust_function_creators的介紹、解釋如下所示:

簡單介紹一下,當二進制日志啟用後,這個變量就會啟用。它控制是否可以信任存儲函數建立者,不會建立寫入二進制日志引起不安全事件的存儲函數。如果設定為0(預設值),使用者不得建立或修改存儲函數,除非它們具有除CREATE ROUTINE或ALTER ROUTINE特權之外的SUPER權限。 設定為0還強制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性聲明函數的限制。 如果變量設定為1,MySQL不會對建立存儲函數實施這些限制。 此變量也适用于觸發器的建立。 請參見第23.7節“Binary Logging of Stored Programs”。

那麼為什麼MySQL有這樣的限制呢? 因為二進制日志的一個重要功能是用于主從複制,而存儲函數有可能導緻主從的資料不一緻。是以當開啟二進制日志後,參數log_bin_trust_function_creators就會生效,限制存儲函數的建立、修改、調用。那麼此時如何解決這個問題呢?官方文檔介紹如下,具體可以參考23.7 Binary Logging of Stored Programs

1: 如果資料庫沒有使用主從複制,那麼就可以将參數log_bin_trust_function_creators設定為1。

mysql> set global log_bin_trust_function_creators=1;

這個動态設定的方式會在服務重新開機後失效,是以我們還必須在my.cnf中設定,加上log_bin_trust_function_creators=1,這樣就會永久生效。

2:明确指明函數的類型,如果我們開啟了二進制日志, 那麼我們就必須為我們的function指定一個參數。其中下面幾種參數類型裡面,隻有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支援。這樣一來相當于明确的告知MySQL伺服器這個函數不會修改資料。

1 DETERMINISTIC 不确定的

2 NO SQL 沒有SQl語句,當然也不會修改資料

3 READS SQL DATA 隻是讀取資料,當然也不會修改資料

4 MODIFIES SQL DATA 要修改資料

5 CONTAINS SQL 包含了SQL語句