mysql函式使用報錯

2022-02-14 19:23:08 字數 1966 閱讀 5118

解決辦法也有兩種,

第一種是在建立子程式(儲存過程、函式、觸發器)時,宣告為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

這是我們開啟了bin-log, 我們就必須指定我們的函式是否是

1 deterministic 不確定的

2 no sql 沒有sql語句,當然也不會修改資料

3 reads sql data 只是讀取資料,當然也不會修改資料

4 modifies sql data 要修改資料

5 contains sql 包含了sql語句

其中在function裡面,只有 deterministic, no sql 和 reads sql data 被支援。如果我們開啟了 bin-log, 我們就必須為我們的function指定乙個引數。

在mysql中建立函式時出現這種錯誤的解決方法:

set global log_bin_trust_function_creators=true;

原因分析:

因為create procedure, create function, alter procedure,alter function,call, drop procedure, drop function等語句都會被寫進二進位制日誌,然後在從伺服器上執行。但是,乙個執行更新的不確定子程式(儲存過程、函式、觸發器)是不可重複的,在從伺服器上執行(相對與主伺服器是重複執行)可能會造成恢復的資料與原始資料不同,從伺服器不同於主伺服器的情況。

為了解決這個問題,mysql強制要求:

在主伺服器上,除非子程式被宣告為確定性的或者不更改資料,否則建立或者替換子程式將被拒絕。

這意味著當建立乙個子程式的時候,必須要麼宣告它是確定性的,要麼它不改變資料。

宣告方式有兩種,

第一種:宣告是否是確定性的

deterministic和not deterministic指出乙個子程式是否對給定的輸入總是產生同樣的結果。

如果沒有給定任一特徵,預設是not deterministic,所以必須明確指定deterministic來宣告乙個子程式是確定性的。 

這裡要說明的是:使用now() 函式(或它的同義)或者rand() 函式不會使乙個子程式變成非確定性的。對now()而言,二進位制日誌包括時間戳並會被正確的執行。rand()只要在乙個子程式內被呼叫一次也可以被正確的複製。所以,www.linuxidc.com可以認為時間戳和隨機數種子是子程式的確定性輸入,它們在主伺服器和從伺服器上是一樣的。

第二種:宣告是否會改變資料  

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錯誤。

Tomcat使用報錯

1.在使用tomcat的時候,如果報錯tomcat is using 表明在後台中tomcat未關閉,找到bin目錄下的shutdown批處理進行關閉即可。2.tomcat server at localhost failed to start這個錯誤表示tomcat server相關並未解除安裝乾...

iedriverserver使用報錯

在win7下面使用iedriverserver報錯 attributeerror service object has no attribute process 2,將iedriverserver win32 2.53.1解壓過後的檔案iedriverserver.exe 不要改名字!放在c pro...

Lua函式呼叫報錯

之前的專案開發中有聽到同事提及過有一種寫法函式在呼叫時會報錯,今天在看書的過程中又看到了,記錄下來 local funa function n if n 0 then return 1 else return n funa n 1 endendprint funa 5 例如上面的 我們想求1 2 3...