Запросы, планы, оптимизация запросов, ...
Модераторы: 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
Сообщение
kdv » 06 июл 2010, 20:50
ему надо OLD. И всегда надо было. Как у вас такая, прямо скажем, фигня, работала в IB - это вина исключительно IB.
Думаю, что Вас ждет много новых открытий в освоении _корректного_ SQL/PSQL в FB. Подчеркиваю - корректного. А не неоднозначного в IB (который остается таковым, похоже, исключительно для совместимости).
-
sdsfy
- Сообщения: 43
- Зарегистрирован: 03 апр 2008, 00:09
Сообщение
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
Сообщение
kdv » 07 июл 2010, 10:09
Шумаков, конечно, хорошо, но там есть ошибки вроде таких или излишества, вроде вытыкания collate pxw_cyrl во все строковые столбцы без разбора.
-
sdsfy
- Сообщения: 43
- Зарегистрирован: 03 апр 2008, 00:09
Сообщение
sdsfy » 07 июл 2010, 11:50
Фигня еще в том, что FB ранее (в IB) созданную структуру метаданных в приведенном мной примере использует и все ок. Но великодушно отказывается такую же создавать уже самому
Что впрочем можно трактовать как преимущество парсера метаданных FB.
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 07 июл 2010, 18:23
Что впрочем можно трактовать как преимущество парсера метаданных FB.
тут скорее недопонимание физики процесса. PSQL, будучи скомпилированным в BLR, далее не проверяется на соответствие синтаксису SQL. PSQL из процедур и триггеров можно вообще удалить, и все будет работать.
Поэтому один раз созданным такой триггер может кочевать между базами и даже серверами ИБ-ФБ до тех пор, пока не потребуется перекомпиляция триггера.
Например, в какой-то версии IB 6 был баг - триггеры срабатывали после check constraints, что позволяло триггерами занести недопустимые значения в столбцы. Исправлялась эта проблема в новой версии ИБ, и только путем перекомпиляции триггеров. Немножко другое, т.к. хоть blr и не менялся, но триггеры "вставали" на свои места.