Шрифт:
– Token unknown - line 4, char 9
– tmp
Нумерация строк начинается со строки, содержащей оператор CREATE, а не С начала файла скрипта. Символы подсчитываются слева направо, а неопределенный элемент указывается либо в виде номера первого символа источника ошибки, либо в виде номера крайнего правого символа источника ошибки. Если есть сомнения, проверяйте всю строку для определения источника синтаксической ошибки.
! ! !
СОВЕТ. Если вы используете версию isql, более позднюю, чем Firebird 1.0, вы заметите улучшение ее возможностей в описании ошибок в скриптах и указании их расположения. Хотя Firebird не содержит средств отладки хранимых процедур, некоторые инструменты сторонних разработчиков имеют такие возможности.
. ! .
Сервер Firebird педантичен при поддержке информации о взаимозависимостях между управляемыми им объектами. Необходимы специальные соглашения при выполнении изменений хранимых процедур, находящихся в текущий момент в использовании другими пользователями. Процедура находится "в использовании" (procedure is in use), когда она в настоящий момент выполняется, или если она была внутренне скомпилирована в кэш метаданных по запросу пользователя. Более того, сервер будет откладывать или запрещать компиляцию операторов ALTER или DROP, если скомпилированная версия будет найдена в кэше метаданных.
Изменения процедур не будут видны клиентским приложениям, пока они не отсоединятся от базы данных и вновь не присоединятся к ней.
! ! !
ПРИМЕЧАНИЕ. Триггеры и хранимые процедуры, вызывающие процедуры, которые были изменены или заново созданы, не имеют доступа к новой версии, пока база данных не окажется в состоянии, когда все клиенты будут отключены.
. ! .
Идеальный вариант - выдача операторов CREATE, RECREATE и ALTER для модулей PSQL в то время, когда не выполняется ни одно клиентское приложение.
Когда вы изменяете процедуру или триггер, новое определение процедуры заменяет старую версию. Для изменения определения процедуры или триггера выполните следующие шаги:
1. Скопируйте файл исходного определения данных, содержащий оператор создания процедуры. В другом варианте - используйте isql -extract для выделения исходного текста процедуры или триггера из базы данных в текстовый файл.
2. Отредактируйте файл, заменив CREATE на RECREATE или ALTER и изменив определение желаемым образом.
3. Выполните измененный скрипт при "чистых" условиях, как было описано ранее. Для удаления модуля выполните:
DROP {PROCEDURE | TRIGGER} имя-модуля;
Только пользователь SYSDBA или владелец процедуры/триггера может изменять или удалять его.
Ошибка "Object is in use" (Объект находится в использовании) расстраивает разработчика более чем какая-либо другая. Вы соединились с базой данных как пользователь SYSDBA или владелец базы данных. У вас исключительный доступ, что желательно при изменении метаданных, и вдруг появляется какой-то фантомный пользователь, использующий объект, метаданные которого вы собираетесь изменить или удалить.
Источником этой загадки может быть одна или более следующих ситуаций.
* При останове базы данных (shut down), подготовке к получению исключительного доступа вы (или другой человек) уже были соединены как пользователь SYSDBA, владелец или (в Linux/UNIX) как пользователь с подходящими привилегиями операционной системы. При проверке условий останова базы данных Firebird игнорирует таких пользователей и все их текущие транзакции или те, которые запускаются после начала останова. Любая неподтвержденная транзакция (какой бы она ни была - даже SELECT), которая использует этот объект или любой объект, зависящий от этого объекта, или объект, от которого зависит наш объект, будет вызывать эту ошибку.
* "Заинтересованная транзакция", которая остается в базе данных в результате ненормального завершения работы какого-либо пользователя и которая использует зависимости, связанные с нашим объектом, вызовет такую ошибку.
* Вы или другой пользователь с подходящими привилегиями ранее пытались переопределить или удалить этот объект или другой зависимый объект, и операция была отвергнута по той причине, что объект находился в использовании.
! ! !
ВНИМАНИЕ! Такая ситуация может провоцировать цепочку несогласованностей в вашей базе данных. Например, если gbak выполнялся в то время, когда база данных имела объекты в таком состоянии, то восстановление резервной копии может оказаться невозможным.
Всякий раз, когда вы видите такую ошибку и верите, что вы насколько возможно уменьшили вероятность ее появления, рассматривайте ее как сигнал, что ваша база данных нуждается в проверке до того, как вы продолжите любые дальнейшие изменения метаданных (см. главу 39).
. ! .
Для просмотра в isql списка процедур или триггеров и их зависимостей используйте команду SHOW PROCEDURES или SHOW TRIGGERS соответственно.
Удаление исходных текстов модулей