Có hai cách để sửa lỗi này:
Thực thi những điều sau trong bảng điều khiển MySQL:
SET GLOBAL log_bin_trust_function_creators = 1;
Thêm phần sau vào tệp cấu hình mysql.ini:
log_bin_trust_function_creators = 1;
Cài đặt này giúp giảm bớt việc kiểm tra các hàm không xác định. Các hàm không xác định là các hàm sửa đổi dữ liệu (nghĩa là có (các) câu lệnh cập nhật, chèn hoặc xóa). Để biết thêm thông tin, hãy xem tại đây .
Xin lưu ý, nếu ghi nhật ký nhị phân KHÔNG được bật, cài đặt này không áp dụng.
Ghi nhật ký nhị phân của các chương trình đã lưu trữ
Nếu ghi nhật ký nhị phân không được bật, log_bin_trust_ Chức năng_creators không được áp dụng.
log_bin_trust_ Chức năng_creators
Biến này áp dụng khi bật ghi nhật ký nhị phân.
Cách tiếp cận tốt nhất là hiểu rõ hơn và sử dụng các khai báo xác định cho các hàm được lưu trữ. Các khai báo này được sử dụng bởi MySQL để tối ưu hóa việc sao chép và việc lựa chọn chúng một cách cẩn thận để có một bản sao lành mạnh là một điều tốt.
XÁC ĐỊNH
Một quy trình được coi là “xác định” nếu nó luôn tạo ra cùng một kết quả cho các tham số đầu vào giống nhau và KHÔNG XÁC ĐỊNH nếu không. Điều này chủ yếu được sử dụng với xử lý chuỗi hoặc toán học, nhưng không giới hạn ở đó.
NOT DETERMINISTIC
Đối lập với "DETERMINISTIC". " Nếu cả DETERMINISTIC và NOT DETERMINISTIC được đưa ra trong định nghĩa thông thường, thì giá trị mặc định là NOT DETERMINISTIC. Để khai báo rằng một hàm là xác định, bạn phải chỉ định DETERMINISTIC một cách rõ ràng. ". Vì vậy, có vẻ như nếu không có tuyên bố nào được thực hiện, MySQl sẽ coi hàm là "KHÔNG XÁC ĐỊNH". Tuyên bố này từ sách hướng dẫn mâu thuẫn với tuyên bố khác từ một lĩnh vực hướng dẫn khác cho biết rằng: "Khi bạn tạo một hàm được lưu trữ, bạn phải khai báo rằng nó là xác định hoặc nó không sửa đổi dữ liệu. Nếu không, nó có thể không an toàn cho việc khôi phục hoặc sao chép dữ liệu. Theo mặc định, để một câu lệnh CREATE FUNCTION được chấp nhận, ít nhất một trong các DỮ LIỆU SQL DETERMINISTIC, NO SQL hoặc READS phải được chỉ định rõ ràng. Nếu không sẽ xảy ra lỗi "
Cá nhân tôi gặp lỗi trong MySQL 5.5 nếu không có khai báo, vì vậy tôi luôn đặt ít nhất một khai báo "DETERMINISTIC", "NOT DETERMINISTIC", "NO SQL" hoặc "READS SQL DATA" bất kể các khai báo khác mà tôi có thể có.
ĐỌC DỮ LIỆU SQL
Điều này nói rõ ràng với MySQL rằng hàm sẽ CHỈ đọc dữ liệu từ cơ sở dữ liệu, do đó, nó không chứa các lệnh sửa đổi dữ liệu, nhưng nó chứa các lệnh SQL đọc dữ liệu (eq SELECT).
MODIFIES SQL DATA
Điều này chỉ ra rằng quy trình chứa các câu lệnh có thể ghi dữ liệu (ví dụ: nó chứa các lệnh UPDATE, INSERT, DELETE hoặc ALTER).
KHÔNG SQL
Điều này chỉ ra rằng quy trình không chứa câu lệnh SQL.
CHỨA SQL
Điều này chỉ ra rằng quy trình chứa các lệnh SQL, nhưng không chứa các câu lệnh đọc hoặc ghi dữ liệu. Đây là mặc định nếu không có đặc điểm nào trong số này được đưa ra rõ ràng. Ví dụ về các câu lệnh như vậy là SELECT NOW (), SELECT 10 + @ b, SET @x = 1 hoặc DO RELEASE_LOCK ('abc'), thực thi nhưng không đọc hoặc ghi dữ liệu.
Lưu ý rằng có các hàm MySQL không an toàn xác định, chẳng hạn như: NOW (), UUID (), v.v., có khả năng tạo ra các kết quả khác nhau trên các máy khác nhau, vì vậy hàm người dùng có chứa các hướng dẫn như vậy phải được khai báo là KHÔNG XÁC ĐỊNH . Ngoài ra, một hàm đọc dữ liệu từ một lược đồ không được giải thích rõ ràng là KHÔNG XÁC ĐỊNH. *
Đánh giá bản chất của một quy trình dựa trên sự “trung thực” của người tạo: MySQL không kiểm tra xem một quy trình được khai báo DETERMINISTIC không có các câu lệnh tạo ra kết quả không xác định. Tuy nhiên, khai báo sai quy trình có thể ảnh hưởng đến kết quả hoặc ảnh hưởng đến hiệu suất. Việc khai báo một quy trình không xác định là DETERMINISTIC có thể dẫn đến kết quả không mong muốn bằng cách khiến trình tối ưu hóa đưa ra các lựa chọn kế hoạch thực thi không chính xác. Việc khai báo một quy trình xác định là NONDETERMINISTIC có thể làm giảm hiệu suất bằng cách khiến các tối ưu hóa có sẵn không được sử dụng.