Chỉ cần nghe câu hỏi thôi cũng khiến tôi nghĩ đến hai khía cạnh:
NHIỆM VỤ # 1: Các chức năng được cho là XÁC ĐỊNH
Nếu đúng như vậy, điều này ngụ ý rằng một hàm sẽ hiển thị cùng một dữ liệu trả về cho một tập hợp các tham số nhất định, KHÔNG CÓ VẤN ĐỀ KHI BẠN GỌI CHỨC NĂNG.
Bây giờ, hãy tưởng tượng một hàm tạo ra một câu trả lời khác nhau vì thu thập dữ liệu vào các thời điểm khác nhau trong ngày dựa trên SQL tĩnh trong hàm. Theo một nghĩa nào đó, điều đó vẫn có thể được coi là DETERMINISTIC nếu bạn truy vấn cùng một tập hợp các bảng và cột mỗi lần, với cùng một bộ tham số.
Điều gì xảy ra nếu bạn có thể thay đổi các bảng cơ bản của hàm thông qua SQL động? Bạn đang vi phạm định nghĩa của hàm DETERMINISTIC.
Lưu ý rằng MySQL đã thêm tùy chọn này trong /etc/my.cnf
log-bin-trust-function-creators
Mặc dù điều này có thể là một sự đơn giản hóa để nói, điều này cho phép các chức năng được phép ghi dữ liệu vào nhật ký nhị phân mà không thực thi nghiêm ngặt thuộc tính DETERMINISTIC.
NHIỆM VỤ # 2: Kích hoạt sẽ có thể được khôi phục
- Bạn có thể tưởng tượng một trình kích hoạt với tất cả các hành vi tương tự như một hàm và sau đó đưa Dynamic SQL vào hỗn hợp không?
- Bạn có thể tưởng tượng việc thử áp dụng MVCC (Điều khiển đa luồng) đối với SQL động sau khi áp dụng MVCC vào bảng cơ sở mà trình kích hoạt có nghĩa là gì không?
Về cơ bản, bạn sẽ có dữ liệu tăng trưởng bậc hai (thậm chí theo cấp số nhân) chỉ trong MVCC. Quá trình quản lý rollback của SQL với các trình kích hoạt có thể không phải là DETERMINISTIC sẽ rất phức tạp, phải nói là ít nhất.
Xét về hai khía cạnh này, tôi chắc chắn các Nhà phát triển MySQL đã nghĩ đến những điều này và nhanh chóng loại bỏ chúng bằng cách áp đặt các hạn chế.
Vì vậy, tại sao nâng hạn chế cho Thủ tục? Nói một cách đơn giản, không có mối quan tâm nào về các thuộc tính DETERMINISTIC hoặc Rollback.