Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
* необязательные блоки WHEN <условие-исключения> DO для перехвата и обработки исключений;
* POST_EVENT <строка> для передачи сообщений клиентам.
Firebird версии 1.5 и более поздние также поддерживает:
* оператор EXECUTE STATEMENT для выполнения специальных операторов DML и DDL в модуле;
* логические контекстные переменные UPDATING, INSERTING и DELETING;
* контекстная переменная ROW_COUNT для получения количества строк, полученных выполненным оператором DML в том же блоке;
* дополнительный синтаксис для EXCEPTION без аргументов - для повторного вызова исключений, а с необязательным текстовым аргументом - для передачи информации
Ограничения PSQL
Существуют некоторые ограничения языка для кодов в модулях PSQL.
* Операторы, использующие подмножество языка определения данных (DDL) SQL Firebird, не разрешены в PSQL [111] .
* Операторы управления транзакциями недопустимы в PSQL, потому что хранимые процедуры и триггеры всегда выполняются в контексте существующей клиентской транзакции, a Firebird не поддерживает вложенные транзакции.
111
В версии 1.5 возможна передача оператора DDL в строке EXECUTE STATEMENT. Делайте это только в особых случаях.
* Некоторые другие типы операторов, зарезервированные для использования в других средах (например, в isql, скриптах или во встроенном SQL - см. следующий раздел). Допустимы все динамические операторы DML.
* Идентификаторы объектов метаданных, такие как имена таблиц, столбцов, просмотров или хранимых процедур, не могут передаваться хранимой процедуре или возвращаться хранимой процедурой в ее аргументах.
* Триггеры не могут получать или возвращать аргументы.
Типы операторов, не поддерживаемых в PSQL
Следующие типы операторов не поддерживаются в триггерах и хранимых процедурах:
* операторы языка определения данных (т. е. операторы, начинающиеся с ключевых слов CREATE, RECREATE, ALTER или DROP; SET GENERATOR; DECLARE EXTERNAL FUNCTION: DECLARE FILTER);
* операторы управления транзакциями: SET TRANSACTION, COMMIT, COMMIT RETAIN,
ROLLBACK, SAVEPOINT, RELEASE SAVEPOINT, ROLLBACK TO SAVEPOINT;
* операторы ESQL: PREPARE, DESCRIBE, EXECUTE;
* операторы CONNECT/DISCONNECT и отправки операторов SQL другим базам данных;
* GRANT/REVOKE;
* EVENT INIT/EVENT WAIT;
* BEGIN DECLARE SECTION/END DECLARE SECTION;
* BASED ON;
* WHENEVER;
* DECLARE CURSOR;
* OPEN;
* FETCH;
* любые операторы, начинающиеся с ключевых слов SET и SHOW.
Исключения
Обработчики исключений могут быть написаны, чтобы "съесть" ошибку, обрабатывая ее разными способами. Например, в итеративной подпрограмме входная строка, вызывающая исключение, необязательно должна приводить к остановке всего процесса. Обработка исключения внутри триггера или хранимой процедуры может позволить пропустить проблемную входную строку - например, поместив сообщение об ошибке в протокол в текстовый файл или в таблицу ошибок - и дав возможность продолжить дальнейшую обработку.
Код в модуле может обрабатывать ошибку в необязательном фрагменте кода, называемом блоком исключения, который является последовательностью операторов, заключенных в операторные скобки BEGIN и END, которым предшествует ключевое слово WHEN.
Необработанное исключение останавливает процесс, отменяет всю выполненную к этому моменту работу [112]
112
Только в отношении работы конкретного запроса SQL, выполненного из клиентского приложения, в "недрах" которого произошла ошибка. Работа, выполненная ранее другими запросами SQL в этой же транзакции, будет сохранена (если транзакция завершится по commit).
– Прим. науч. ред.
Обработка исключений и ошибок подробно обсуждается в главе 32.
События
События Firebird являются "сигналами", которые модули PSQL могут накапливать в процессе выполнения для передачи клиентским приложениям, когда работа будет подтверждена. Клиентские приложения в сети могут прослушивать- с использованием обработчика сообщений- конкретные события, в которых они заинтересованы, без необходимости специального опроса наличия события.
Программирование с событиями и задание приложениям указания на их прослушивание рассматривается в главе 32.
Безопасность
Процедурам и триггерам могут быть предоставлены привилегии для специфических действий (SELECT, INSERT, DELETE и т.д.) к таблицам точно так же, как пользователям или ролям предоставляются привилегии. Не существует специального синтаксиса: используется обычный оператор GRANT, но в предложении то указывается триггер или процедура вместо пользователя или роли. Аналогичным образом привилегии процедур и триггеров могут отменяться оператором REVOKE.
Не всегда существует необходимость предоставлять привилегии модулям процедур или триггеров. Достаточно либо пользователю, либо модулю иметь привилегии к действиям, выполняемым модулем.
Например, если пользователь выполняет UPDATE для таблицы А, что вызывает триггер, а триггер выполняет INSERT для таблицы в, то это действие будет допустимым, если пользователь имеет привилегии INSERT к этой таблице или триггер имеет привилегии INSERT к этой таблице.
Если у триггера или процедуры нет достаточных привилегий для выполнения их действий, Firebird вызывает ошибку SQL и устанавливает соответствующий код ошибки. Вы можете перехватить этот код ошибки в обработчике исключений точно так же, как и другие исключения. Информацию об операторах GRANT и REVOKE см. в главе 35.
Внутреннее устройство технологии
Когда любой запрос вызывает хранимую процедуру, то текущее определение этой хранимой процедуры копируется в этот момент в кэш метаданных. В Классическом сервере эта копия присутствует в течение всего времени пользовательского соединения. В Суперсервере она сохраняется "живой", пока не будет отключено последнее соединение.
Запрос приходит от одного из следующих объектов:
* от клиентского приложения, которое напрямую выполняет хранимую процедуру;