Samo usłyszenie pytania kojarzy mi się z dwoma aspektami:
ASPEKT 1: Funkcje mają być DETERMINISTYCZNE
Jeśli tak, oznacza to, że funkcja powinna konsekwentnie prezentować te same dane zwrotne dla danego zestawu parametrów, BEZ WZGLĘDU NA WYWOŁANIE FUNKCJI.
Teraz wyobraź sobie funkcję, która daje inną odpowiedź z powodu gromadzenia danych o różnych porach dnia w oparciu o statyczny SQL w funkcji. W pewnym sensie można to nadal uznać za DETERMINISTYCZNE, jeśli za każdym razem pytasz ten sam zestaw tabel i kolumn, biorąc pod uwagę ten sam zestaw parametrów.
Co jeśli możesz zmienić podstawowe tabele funkcji za pomocą Dynamicznego SQL? Naruszasz definicję funkcji DETERMINISTYCZNEJ.
Zauważ, że MySQL dodał tę opcję w /etc/my.cnf
log-bin-trust-function-creators
Chociaż może to być nadmierne uproszczenie, pozwala to funkcjom na zapis danych w dziennikach binarnych bez ścisłego egzekwowania właściwości DETERMINISTIC.
ASPEKT 2: Wyzwalacze powinny mieć możliwość wycofania
- Czy możesz sobie wyobrazić wyzwalacz z tymi samymi zachowaniami jako funkcją, a następnie wprowadzający dynamiczny SQL do miksu?
- Czy możesz sobie wyobrazić próbę zastosowania MVCC (Multiversion Concurrecy Control) wobec Dynamic SQL po zastosowaniu MVCC do tabeli podstawowej, dla której przeznaczony był wyzwalacz?
Zasadniczo miałbyś dane, które rosną kwadratowo (nawet wykładniczo) tylko w samym MVCC. Proces zarządzania wycofywaniem SQL za pomocą wyzwalaczy, które mogą nie być DETERMINISTYCZNE, byłby, co najmniej, bezbożny.
W świetle tych dwóch aspektów jestem pewien, że programiści MySQL pomyśleli o tych rzeczach i szybko je odrzucili, nakładając ograniczenia.
Po co więc znosić ograniczenie procedur? Mówiąc najprościej, nie ma obaw co do właściwości DETERMINISTYCZNYCH ani wycofywania.