Переход с fb 1.5 на fb 2.0

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

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

Ответить
sundoom
Сообщения: 10
Зарегистрирован: 18 окт 2007, 09:53

Переход с fb 1.5 на fb 2.0

Сообщение sundoom » 25 окт 2007, 06:58

Объясните, плиз, почему не работают подобные запросы:

Delete from im where im.fk=document.st

выдает ошибку:

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
DOCUMENT.ST.
At line 1, column 37.

Сообщает, что нет такой таблицы. Хотя таблицы и соответствующие поля существуют. Причем все это работало на прежней версии.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 25 окт 2007, 08:17

На прежней версии MS SQL это может и работало, но птичка не умела удалять из двух таблиц разом никогда.

sundoom
Сообщения: 10
Зарегистрирован: 18 окт 2007, 09:53

Сообщение sundoom » 25 окт 2007, 08:52

Dimitry Sibiryakov писал(а):На прежней версии MS SQL это может и работало, но птичка не умела удалять из двух таблиц разом никогда.
Сорри, это организовано в тригере:

***************************************************
CREATE TRIGGER DEL_IM FOR DOCUMENT
ACTIVE BEFORE DELETE POSITION 0
AS

begin
Delete from im where im.fk=document.st;
if (document.kod=14) then begin
delete from ip_stop
WHERE fk=document.fk and pk=document.pk_ip_stop and vid_action="отложено";
end

end
***************************************************

При дальнейшей отладке, выдается ошибка на другую таблицу c полем, например, на document.kod и т.д. НО опять же не везде. Где-то такие конструкции прокатывают.
Дело в том, что проблема вообще не только в подобных запросах (не обязательно на удаление). Такое может быть и с distinct и c select'ом.Почему так? На fb 1.5 это работало.

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

Сообщение kdv » 25 окт 2007, 09:20

в триггере для столбцов не указывается алиас таблицы. это раз.
И, если пишешь запрос, указывай алиасы таблицы.
например
select tbl.a from table tbl where tbl.id ....
а не
select a from table where table.id ....

т.е. алиасы или не пишутся совсем или указываются по полной программе.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 25 окт 2007, 10:50

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

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

delete from im where fk = old.st;

sundoom
Сообщения: 10
Зарегистрирован: 18 окт 2007, 09:53

Сообщение sundoom » 25 окт 2007, 11:19

WildSery писал(а):
sundoom писал(а):Сорри, это организовано в тригере:
Не работает, потому что ты заложился на баг, исправленный в дальнейших версиях.
В корне неправильно обращаться к значениям по названию таблицы, вместо этого надо использовать префиксы NEW и OLD.
[/code]
Извините за идиотский вопрос (я еще учусь) но какой механизм у этих префиксов и почему именно old а не new в данном случае?
Плиз, посоветуйте литературу на русском по firebird'у для новичка, чтоб не возникало таких вопросов.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 25 окт 2007, 11:40

sundoom писал(а):какой механизм у этих префиксов и почему именно old а не new в данном случае?
Потому что триггер BEFORE DELETE. А какое новое значение поля может быть при удалении?
Новое значение может быть при вставке (и при этом не может быть старого), и при апдейте (и новое, и старое доступны).
sundoom писал(а):Плиз, посоветуйте литературу на русском по firebird'у для новичка, чтоб не возникало таких вопросов.
Хелен Борри, наверное. Если есть где лучше описано - меня Дмитрий поправит. Смотри раздел документации, там и статьи, и книжки посоветованы.
Я сам, так получилось, ни одной книжки не читал. Хотя заглядывал во многие, если какой-то вопрос возникал.

belov-evgenii
Сообщения: 52
Зарегистрирован: 28 сен 2007, 10:19

Сообщение belov-evgenii » 25 окт 2007, 11:49

Ептыть, коллега, эти триггеры давно нужно было поправить. Релиз проги-то когда был? Пятнадцатого еще. А сейчас уже 25. А работы там на час всего, триггеры эти ваши поправить. Может все таки будем сотрудничать поплотнее?
Может вы все-таки слезете со своего IB 7.* и будете как все, на FB? Ну чтоб поближе к народу, так сказать.

Ответить