Вопрос

Согласно Ограничения на сохраненные процедуры и триггеры, Dynamic SQL не может быть использован (ограничение поднято для сохраненных процедур в версии 5.0.13 и позже). Почему это ограничение на месте? И зачем поднимать его для процедур, но не функций или триггеров?

Это было полезно?

Решение

Просто услышав вопрос заставляет меня задуматься о двух аспектах:

Аспект № 1: Функции должны быть детерминированными

Если это так, это подразумевает, что функция должна последовательно представлять те же данные о возврате для данного набора параметров, независимо от того, когда вы называете функцию.

Теперь представьте себе функцию, которая дает другой ответ из -за сбора данных в разное время дня на основе статического SQL в функции. В некотором смысле, это все еще можно считать детерминированным, если вы запрашиваете один и тот же набор таблиц и столбцов каждый раз, учитывая один и тот же набор параметров.

Что если бы вы могли изменить базовые таблицы функции с помощью динамического SQL? Вы нарушаете определение детерминированной функции.

Обратите внимание, что MySQL добавил эту опцию в /etc/my.cnf

log-bin-trust-function-creators

Хотя это может быть упрощением, чтобы сказать, что это позволяет функциям разрешать записывать данные в бинарные журналы без строгого соблюдения детерминированного свойства.

Аспект № 2: Триггеры должны быть в состоянии откатить

  • Можете ли вы представить себе триггер со всеми же поведениями, что и функция, а затем ввести динамический SQL в микс?
  • Можете ли вы представить себе попытку подать заявку MVCC (Multiverse Contrurcy Control) Против динамического SQL после применения MVCC к базовой таблице, для которого был предназначен триггер?

По сути, у вас будут данные, которые растет квадратично (даже в геометрической прогрессии) только только в MVCC. Процесс управления откатом SQL с помощью триггеров, которые могут быть нетерминированными, был бы нечестно сложным, если не сказать больше.

В свете этих двух аспектов, я уверен, что разработчики MySQL думали об этих вещах и быстро уволили их, наложив ограничения.

Итак, зачем поднимать ограничение для процедур? Проще говоря, нет никакого беспокойства по поводу детерминированных свойств или отката.

Другие советы

Это отличный вопрос, но я не знаю ответа. Я полагаю, что это придется рассказать о команде по внутренним органам, но я не знаю, что они будут большими на этом сайте. А пока я могу помочь вам вывести несколько ответов.

Для начала я вижу это:

Кэш триггера не обнаруживается при изменении метаданных базовых объектов. Если триггер использует таблицу, и таблица изменилась с тех пор, как спусковой крючок был загружен в кэш, триггер работает с использованием устаревших метаданных.

Что заставляет меня думать, что это как -то связано с этим. Это не будет перекомпилировать SQL, если он даже не контролирует метаданные. Что означает, что это проблема двигателя.

Точно так же, когда я читаю этот блок, я думаю, что то же самое (двигатель):

Чтобы предотвратить проблемы взаимодействия между потоками сервера, когда клиент выдает оператор, сервер использует снимок подпрограмм и триггеров, доступных для выполнения оператора. То есть сервер вычисляет список процедур, функций и триггеров, которые могут использоваться во время выполнения оператора, загружают их, а затем продолжает выполнять оператор. Это означает, что, хотя оператор выполняется, он не увидит изменений в подпрограммах, выполняемых другими потоками.

Так что в целом я не совсем уверен, почему они этого не позволяют, но я могу догадаться. Извините, что я не могу вам больше помочь, я открыт, чтобы разыскать это еще немного. Лучше всего надеяться для некоторых активных разработчиков MySQL, как только мы уйдем с частной бета -версией;)

Во многом это связано с безопасностью. Исключение для процедур заключается в том, что динамический SQL в рамках процедуры может быть назначен контекст безопасности выполняющего пользователя. Это означает, что даже если двигатель не знает какие будет выполнен, он может убедиться, что пользователю разрешается получить доступ к указанным объектам.

Кроме того, вы можете поднять уродливые проблемы того, что могло произойти, если бы это допустимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top