11.1. Ограничения на сохраненные подпрограммы и триггеры

11.1. Ограничения на сохраненные подпрограммы и триггеры

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

Сохраненные подпрограммы не могут содержать произвольные инструкции SQL. Следующие инструкции отвергнуты:

Инструкции блокировки LOCK TABLES и UNLOCK TABLES.

LOAD DATA и LOAD TABLE.

Подготовленные инструкции SQL (PREPARE, EXECUTE, DEALLOCATE PREPARE).

Вы не можете использовать динамический SQL внутри сохраненных подпрограмм (где Вы создаете динамически инструкции как строки, а затем выполняете их). Это ограничение снимается в MySQL 5.0.13 для сохраненных процедур, но это все еще применяется к сохраненным функциям и триггерам.

Для сохраненных функций (но не для процедур) следующие дополнительные инструкции или операции отвергнуты:

Инструкции, которые делают явный или неявный commit или rollback.

Инструкции, которые возвращают набор результатов. Это включает инструкции SELECT, которые не имеют предложения INTO var_list, и инструкции SHOW. Функция может обрабатывать набор результатов через SELECT … INTO var_list или используя курсор и инструкции FETCH.

Все инструкции FLUSH.

Инструкции рекурсии. То есть, сохраненные функции не могут использоваться рекурсивно.

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

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

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

CREATE PROCEDURE p (i INT)

BEGIN

DECLARE i INT DEFAULT 0;

SELECT i FROM t;

BEGIN

DECLARE i INT DEFAULT 1;

SELECT i FROM t;

END;

END;

В таких случаях идентификатор неоднозначен, и следующие правила старшинства применяются:

Локальная переменная имеет приоритет над стандартным параметром или столбцом таблицы.

Стандартный параметр имеет приоритет над столбцом таблицы.

Локальная переменная во внутреннем блоке имеет приоритет над локальной переменной во внешнем блоке.

Поведение, что столбцы таблицы не имеют приоритет над переменными, ненормативно.

Использование сохраненных подпрограмм может вызывать проблемы дублирования. Эта проблема рассмотрена далее.

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

Не имеется никакой системы отладки сохраненных подпрограмм.

Инструкции CALL не могут быть подготовлены.

Драйверы UNDO не обеспечиваются.

Циклы FOR не обеспечиваются.

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

Инструкция RENAME DATABASE не перемещает сохраненные подпрограммы к новому имени схемы.

Для триггеров следующие дополнительные инструкции или операции отвергнуты:

Триггеры в настоящее время не активизированы действиями внешнего ключа.

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

Триггеры не позволяются на таблицах в базе данных mysql.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Триггеры

Из книги автора

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


Триггеры

Из книги автора

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


Глава 5. Сохраненные процедуры и функции

Из книги автора

Глава 5. Сохраненные процедуры и функции Сохраненные подпрограммы (процедуры и функции) обеспечиваются в MySQL 5.0. Сохраненная процедура представляет собой набор инструкций SQL, которые могут быть сохранены на сервере. Если это было выполнено, клиентура не должна хранить


5.1. Сохраненные подпрограммы и таблицы предоставления привилегий

Из книги автора

5.1. Сохраненные подпрограммы и таблицы предоставления привилегий Сохраненные подпрограммы требуют таблицы proc в базе данных mysql. Эта таблица создана в течение процедуры установки MySQL 5.0. Если Вы наращиваете вычислительные возможности до MySQL 5.0 из более ранней версии,


5.3. Сохраненные процедуры, функции, триггеры и LAST_INSERT_ID()

Из книги автора

5.3. Сохраненные процедуры, функции, триггеры и LAST_INSERT_ID() Внутри тела сохраненной подпрограммы (процедуры или функции) или триггера значение LAST_INSERT_ID() меняется по обычным правилам. Эффект сохраненной подпрограммы или триггера на значение LAST_INSERT_ID(), который замечен


5.4. Сохраненные процедуры, функции, триггеры и репликация

Из книги автора

5.4. Сохраненные процедуры, функции, триггеры и репликация В MySQL 5.0 сохраненные процедуры и функции работают с репликацией?Да, стандартные действия, выполненные в сохраненных процедурах и функциях, скопируются. Имеются несколько ограничений, которые описаны подробно в


Глава 6. Триггеры

Из книги автора

Глава 6. Триггеры Поддержка для триггеров включена, начиная с MySQL 5.0.2. Триггер представляет собой именованный объект базы данных, который связан с таблицей, и он будет активизирован, когда специфическое событие происходит для таблицы. Например, следующие инструкции


Хранимые процедуры и триггеры

Из книги автора

Хранимые процедуры и триггеры Firebird имеет богатый язык процедурных расширений, PSQL, для написания хранимых процедур и триггеров. Это структурированный язык с поддержкой циклов FOR для множеств, условными переходами, обработкой ошибок и пересылкой событий. После создания


Триггеры

Из книги автора

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


Триггеры действий пользователя

Из книги автора

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


Пользовательские триггеры

Из книги автора

Пользовательские триггеры В пользовательских триггерах (тех, которые вы пишете сами, используя язык PSQL) у вас есть возможность точно задать, что происходит, когда сервер получает запрос на добавление, изменение или удаление строк таблицы. Пользовательские триггерымогут


Триггеры

Из книги автора

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


Триггеры

Из книги автора

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


Триггеры и транзакции

Из книги автора

Триггеры и транзакции Триггеры всегда выполняются в контексте конкретной операции DML, как часть этой операции и внутри той транзакции, которая осуществляет запрос оператора DML. Нет смысла отделять их от транзакции или от операции, которая привела к выполнению триггера.


ГЛАВА 31. Триггеры.

Из книги автора

ГЛАВА 31. Триггеры. Триггеры - ключевые элементы среди возможностей, предоставляемых Firebird для централизованной реализации бизнес-правил внутри системы управления базой данных. Триггер является автономным модулем, который выполняется автоматически, когда выполняется