Cơ sở dữ liệu của chúng tôi có chức năng tạo số thứ tự. Nó đọc một giá trị từ một bảng Settings, tăng nó, sau đó trả về giá trị mới. Ví dụ:TẠO CHỨC NĂNG lỗi "Chức năng này không có DETERMINISTIC, NO SQL hoặc READS SQL DATA"
CREATE FUNCTION NextOrderNumber() RETURNS INTEGER UNSIGNED NOT DETERMINISTIC
BEGIN
DECLARE number INTEGER UNSIGNED;
UPDATE Settings SET IntegerValue=LAST_INSERT_ID(IntegerValue+1) WHERE KeyName='NextOrderNumber';
SET number=LAST_INSERT_ID();
return number;
END
Lưu ý: Đừng phê bình chức năng này tôi biết nó có sai sót chỉ để minh hoạ.
Chúng tôi sử dụng chức năng này như sau:
INSERT INTO Orders(OrderNumber, ...)
SELECT NextOrderNumber(), ...
Khi đăng nhập nhị phân được kích hoạt, CREATE FUNCTION cho lỗi này:
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)
Bất kể những gì binlog_format được thiết lập, có thực sự là một vấn đề với các chức năng trên? Theo đọc của tôi về các MySQL page có liên quan tôi không thể thấy bất kỳ lý do tại sao chức năng này sẽ không tương thích với nhân rộng, với một trong hai mức ghi nhật ký nhị phân ROW hoặc STATEMENT.
Nếu chức năng này an toàn, hãy đặt log_bin_trust_function_creators = 1 toàn cầu làm tôi khó chịu. Tôi không muốn vô hiệu hóa kiểm tra này cho tất cả các chức năng, chỉ cần một chức năng này. Thay vào đó, tôi có thể gắn cờ hàm này là NO SQL để chặn cảnh báo không? Tôi đã thử và nó đã hoạt động. Điều này có gây ra bất kỳ vấn đề nào không?
symcbean - Tôi hiểu cách tiếp cận này không hoạt động trong một cụm. Tôi không hỏi về kịch bản đó. Tôi hỏi về thiết lập master-slave đơn giản, nơi chèn/cập nhật chỉ diễn ra ở một nơi. – richb