Ошибка при создании триггера на FB2.1.3 (на FB1 работало)

Совместимость InterBase, Firebird, Yaffil между собой и по версиям

Модераторы: kdv, Alexey Kovyazin

Ответить
sland
Сообщения: 12
Зарегистрирован: 11 мар 2008, 10:50

Ошибка при создании триггера на FB2.1.3 (на FB1 работало)

Сообщение sland » 16 мар 2010, 13:20

Здравствуйте!
Вот скрипт создания триггера, который на FB1 создается и отлично работает, а на FB2 даже не создается
(ошибка "This column cannot be updated because it is derived from an SQL function or expression.
attempted update of read-only column.")

Код: Выделить всё

CREATE trigger beznal_au0 for beznal
active after update position 0
AS
begin
  new.sum_after=new.sum_before+new.sum_new;
end
Если я правильно понял, то зависимое поле не может быть обновлено, т.к. является read-only?
Но, повторюсь, на FB1 отлично работает. Пробовал backup-restore базы под разными версиями, но результат тот же. Причем на FB2 я пробовал по всякому:
и new.sum_after=0;
и new.sum_new=0;
и new.sum_before=0;
т.е. какое бы поле я не изменял, ошибка одна и та же.
Думаю, что тут есть какие-то различия в версиях, которых я не знаю. Может кто-нибудь подскажет, в чем дело?

Заранее благодарен.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Ошибка при создании триггера на FB2.1.3 (на FB1 работало

Сообщение hvlad » 16 мар 2010, 13:50

Релизноты не читал, не читаю и читать не буду.
Думать головой - тоже.

Как можно что-то присвоить NEW в AFTER триггере ? Уже всё, апдейт произошёл, поезд уехал :)

sland
Сообщения: 12
Зарегистрирован: 11 мар 2008, 10:50

Re: Ошибка при создании триггера на FB2.1.3 (на FB1 работало

Сообщение sland » 16 мар 2010, 15:48

Хорошо, я согласен, что значение уже вставлено.
Подскажите, пожалуйста, как после выполнения всех остальных триггеров изменить значение поля? Мне не хотелось бы для такой простой операции писать типа "UPDATE Beznal ...." Не будет ли бесконечным цикл After Update, если в триггере AU выполнять update? Как тогда вообще пользоваться триггером After Update?
Кроме того, в FB1 работало, просто значения new и old фактически означали одно и то же, но давали простой доступ к полям таблицы только что измененной записи.
Релизноты не читал, не читаю и читать не буду.
Дело в том, что я в этом деле самоучка и не свосем в курсе. Что такое релизноты, если говорить грамотным языком? Где с ними ознакамливаться? Как часто это нужно делать? При возникновении спорного вопроса, как искать ответ?
Думать головой - тоже.
См. ответ выше.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Ошибка при создании триггера на FB2.1.3 (на FB1 работало

Сообщение kdv » 16 мар 2010, 19:21

Но, повторюсь, на FB1 отлично работает.
это НЕ работает. Т.е. синтаксис проходит, но результата никакого не дает.
как после выполнения всех остальных триггеров изменить значение поля?
никак. при вызове триггеров after update обновление уже кончилось, запись обновлена.
будет ли бесконечным цикл After Update, если в триггере AU выполнять update?
может, если не предотвращать такую рекурсию специально, что свидетельствует о фиговом дизайне БД и логики работы с ней.
FB1 работало, просто значения new и old фактически означали одно и то же, но давали простой доступ к полям
так и в FB 2 работает. Но только на чтение. Ты же присваиваешь значение столбцу new.
Что такое релизноты, если говорить грамотным языком? Где с ними ознакамливаться?
Release Notes в папке куда Firebird поставился. Там описание чем эта версия отличается от предыдущих.
При возникновении спорного вопроса, как искать ответ?
в разных местах. зависит от вопроса. По поводу "работало так, а теперь не работает" - в ReleaseNotes. Также нужно помнить, что в каждой новой версии ФБ исправляются не только ошибки, но и то, что работало неправильно в предыдущих версиях. Допускать присвоение new в after update - неправильно, потому что это бессмысленная операция, которая вводит в заблуждение.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Ошибка при создании триггера на FB2.1.3 (на FB1 работало

Сообщение hvlad » 16 мар 2010, 19:33

sland писал(а):Хорошо, я согласен, что значение уже вставлено.
Ну спасибо :lol:
sland писал(а):Подскажите, пожалуйста, как после выполнения всех остальных триггеров изменить значение поля? Мне не хотелось бы для такой простой операции писать типа "UPDATE Beznal ...." Не будет ли бесконечным цикл After Update, если в триггере AU выполнять update? Как тогда вообще пользоваться триггером After Update?
Нужно пользоваться триггером BEFORE (AFTER) там, где это нужно.
Можно иметь несколько триггеров и указывать очерёдность их срабатывания.
sland писал(а):Кроме того, в FB1 работало, просто значения new и old фактически означали одно и то же, но давали простой доступ к полям таблицы только что измененной записи.
Там много чего "работало". Баги не живут вечно, их исправляют.
sland писал(а):Что такое релизноты, если говорить грамотным языком?
Release Notes, документация, поставляемая с дистрибутивом Firebird (и многих других продуктов)

sland
Сообщения: 12
Зарегистрирован: 11 мар 2008, 10:50

Re: Ошибка при создании триггера на FB2.1.3 (на FB1 работало

Сообщение sland » 17 мар 2010, 00:36

Спасибо всем за помощь. Все понятно.

Пока по-топорному сделал, через update, буду думать, как логику БД переделать.

Ответить