Hanya mendengarkan pertanyaan membuat saya berpikir tentang dua aspek:
ASPEK # 1: Fungsi seharusnya DETERMINISTIK
Jika demikian, ini menyiratkan bahwa suatu fungsi harus menyajikan data pengembalian yang sama secara konsisten untuk satu set parameter tertentu, TANPA MASALAH KETIKA ANDA PANGGIL FUNGSI.
Sekarang, bayangkan fungsi yang menghasilkan jawaban yang berbeda karena mengumpulkan data pada waktu yang berbeda dalam sehari berdasarkan SQL statis dalam fungsi. Dalam arti tertentu, itu masih bisa dianggap DETERMINISTIK jika Anda meminta set tabel dan kolom yang sama setiap kali, mengingat set parameter yang sama.
Bagaimana jika Anda bisa mengubah tabel yang mendasari suatu fungsi melalui Dynamic SQL? Anda melanggar definisi fungsi DETERMINISTIK.
Perhatikan bahwa MySQL menambahkan opsi ini di /etc/my.cnf
log-bin-trust-function-creators
Meskipun ini mungkin merupakan penyederhanaan yang berlebihan untuk dikatakan, ini memungkinkan fungsi diizinkan untuk menulis data ke dalam log biner tanpa secara ketat menegakkan properti DETERMINISTIC.
ASPEK # 2: Pemicu harus dapat diputar kembali
- Bisakah Anda membayangkan pemicu dengan semua perilaku yang sama sebagai fungsi dan kemudian memperkenalkan Dynamic SQL ke dalam campuran?
- Bisakah Anda bayangkan mencoba menerapkan MVCC (Multiversion Concurrecy Control) terhadap Dynamic SQL setelah menerapkan MVCC ke tabel dasar pemicu itu dimaksudkan?
Anda pada dasarnya akan memiliki data yang tumbuh secara kuadratik (bahkan secara eksponensial) hanya di MVCC saja. Proses mengelola rollback SQL dengan pemicu yang bisa non-DETERMINISTIC akan menjadi rumit, untuk sedikitnya.
Mengingat kedua aspek ini, saya yakin Pengembang MySQL memikirkan hal-hal ini dan dengan cepat mengabaikannya dengan memberlakukan batasan.
Jadi, mengapa mengangkat batasan untuk Prosedur? Sederhananya, tidak ada kekhawatiran atas properti DETERMINISTIC atau Rollback.