Просто слушая вопрос, я думаю о двух аспектах:
АСПЕКТ № 1: Функции должны быть ДЕТЕРМИНИСТИЧЕСКИМИ
Если это так, это означает, что функция должна последовательно представлять одни и те же возвращаемые данные для заданного набора параметров, НИКАКОГО МАТЕРИИ, КОГДА ВЫ ВЫЗЫВАЕТЕ ФУНКЦИЮ.
Теперь представьте себе функцию, которая выдает другой ответ из-за сбора данных в разное время дня на основе статического SQL в функции. В некотором смысле это все еще можно считать ДЕТЕРМИНИСТИЧЕСКИМ, если вы каждый раз запрашиваете один и тот же набор таблиц и столбцов, учитывая один и тот же набор параметров.
Что если бы вы могли изменить базовые таблицы функции через динамический SQL? Вы нарушаете определение ДЕТЕРМИНИСТИЧЕСКОЙ функции.
Обратите внимание, что MySQL добавил эту опцию в /etc/my.cnf
log-bin-trust-function-creators
Хотя это может быть слишком упрощенным, но позволяет функциям записывать данные в двоичные журналы без строгого соблюдения свойства DETERMINISTIC.
АСПЕКТ № 2: Триггеры должны иметь возможность отката
- Можете ли вы представить триггер с тем же поведением, что и функцию, а затем ввести динамический SQL в смесь?
- Можете ли вы представить себе попытку применить MVCC (Multiversion Concurrecy Control) к Dynamic SQL после применения MVCC к базовой таблице, для которой предназначался триггер?
По сути, у вас есть данные, которые растут квадратично (даже экспоненциально) только в одной только MVCC. Процесс управления откатом SQL с помощью триггеров, которые могут быть недетерминированными, был бы, по меньшей мере, ужасно сложным.
В свете этих двух аспектов, я уверен, что разработчики MySQL подумали об этих вещах и быстро отклонили их, введя ограничения.
Итак, зачем снимать ограничение на процедуры? Проще говоря, это не касается ДЕТЕРМИНИСТИЧЕСКИХ свойств или отката.