MySQL建立自定義函式

奮鬥的小青年_發表於2017-02-19

MySQL中建立function的時候出現了"ERROR 1418 (HY000): 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)"的錯誤資訊。如下圖所示:


出現這個錯誤的原因是:

我們開啟了bin-log日誌(與MySQL的主從複製有關),slave會從master複製資料,而一些操作,比如function所得的結構在master和slave上的可能不同,所以存在潛在的安全隱患。因此預設情況下會組織function的建立。

解決這個問題有兩種辦法:

1、將Mysql Server的“log_bin_trust_function_creators”引數設定為ON,這樣一來開啟了log-bin的MySQL Server便可以隨意建立function。這裡存在潛在的資料安全問題,除非明確的知道建立function在master和slave上的行為完全一致。

我們可以通過命令列來設定該引數,如下所示

mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)

mysql> set global log_bin_trust_function_creators=1;
Query OK, 0 rows affected (0.00 sec)


mysql> show variables like 'log_bin_trust_function_creators';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON    |
+---------------------------------+-------+
1 row in set (0.00 sec)

注:這種方式重啟MySQL服務後設定就會失效,如果想要永久生效,需要在MySQL的配置檔案中顯示配置。另外,如果再mster上建立函式,想通過主從複製的方式將函式複製到slsave上則也需在開啟了log-bin的slave中設定上述變數為ON(變數的設定不會從master複製到slave上,這點需要注意),否則主從複製會報錯。

2、明確指定我們的函式型別

1)、DETERMINISTIC    不確定的

2)、NO SQL    沒有sql語句,不會修改資料

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

這樣一來相當於明確的告知MySQL Server這個函式不會修改資料,因此可以在開啟了log-bin的伺服器上安全的建立並被複制到開啟了log-bin的salve上。

相關文章