Триггер не создается

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Триггер не создается

Сообщение sdsfy » 06 июл 2010, 20:27

Коллеги, в любой версии IB 5.6 - 2007 включительно нижеприведенный скрипт работает. Но полностью отказывается функционировать на FB 2.0 в любых редакциях. А именно - выдает сообщение что мол не знает он поля DATA_MAIN.MAIN_ID; это поле точно содержится в таблице к которой этот триггер и создается. В чем же дело?

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

CREATE TRIGGER AD_DATA_MAIN FOR DATA_MAIN AFTER DELETE POSITION 0 AS
  BEGIN

	DELETE FROM DATA_ANSWERS
	WHERE DATA_ANSWERS.MASTER_ID = DATA_MAIN.MAIN_ID;

	DELETE FROM DATA_SCALES
	WHERE DATA_SCALES.MASTER_ID = DATA_MAIN.MAIN_ID;
  
  END

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

Re: Триггер не создается

Сообщение kdv » 06 июл 2010, 20:50

ему надо OLD. И всегда надо было. Как у вас такая, прямо скажем, фигня, работала в IB - это вина исключительно IB.
Думаю, что Вас ждет много новых открытий в освоении _корректного_ SQL/PSQL в FB. Подчеркиваю - корректного. А не неоднозначного в IB (который остается таковым, похоже, исключительно для совместимости).

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: Триггер не создается

Сообщение sdsfy » 06 июл 2010, 21:42

kdv писал(а):ему надо OLD. И всегда надо было. Как у вас такая, прямо скажем, фигня, работала в IB - это вина исключительно IB.
Думаю, что Вас ждет много новых открытий в освоении _корректного_ SQL/PSQL в FB. Подчеркиваю - корректного. А не неоднозначного или кривого в IB.
Такая фигня у меня не из моих сочинительтских талантов, а из книги Шумакова ПВ. Delphi 3 и создание приложений баз данных. Там именно так и описано, и что самое интересное в IB работает аж с 2000-го года. стало быть: либо автор книги большой оптимист и оптимизм ему помогает, либо так и должно быть. правда я нигде более не нашел, что такое может применяться. Вероятно в IB в таком контексте подразумевается OLD. По логике понимаю, что такого не должно быть. Но поскольку слишком много надо переделывать(это один из нескольких десятков скриптов), хотел надеяться что без переделки скрипта можно обойти проблему.

Я не большой спец про построению БД. В принципе слишком разные задачи приходится решать, и не хватает времени для столь глубокого освоения FB/IB чтоб абсолютно все корректно строить :) хотя как знать... со временем могет быть все.

Спасибо за помощь!

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

Re: Триггер не создается

Сообщение kdv » 07 июл 2010, 10:09

Шумаков, конечно, хорошо, но там есть ошибки вроде таких или излишества, вроде вытыкания collate pxw_cyrl во все строковые столбцы без разбора.

sdsfy
Сообщения: 43
Зарегистрирован: 03 апр 2008, 00:09

Re: Триггер не создается

Сообщение sdsfy » 07 июл 2010, 11:50

Фигня еще в том, что FB ранее (в IB) созданную структуру метаданных в приведенном мной примере использует и все ок. Но великодушно отказывается такую же создавать уже самому :) Что впрочем можно трактовать как преимущество парсера метаданных FB.

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

Re: Триггер не создается

Сообщение kdv » 07 июл 2010, 18:23

Что впрочем можно трактовать как преимущество парсера метаданных FB.
тут скорее недопонимание физики процесса. PSQL, будучи скомпилированным в BLR, далее не проверяется на соответствие синтаксису SQL. PSQL из процедур и триггеров можно вообще удалить, и все будет работать.
Поэтому один раз созданным такой триггер может кочевать между базами и даже серверами ИБ-ФБ до тех пор, пока не потребуется перекомпиляция триггера.

Например, в какой-то версии IB 6 был баг - триггеры срабатывали после check constraints, что позволяло триггерами занести недопустимые значения в столбцы. Исправлялась эта проблема в новой версии ИБ, и только путем перекомпиляции триггеров. Немножко другое, т.к. хоть blr и не менялся, но триггеры "вставали" на свои места.

Ответить