Firebird 1.5 Views trigger problem
2 отговора
178 прегледа
Firebird 1.5 Views trigger problem
Здравейте,
имам следния проблем:
Ползвам Firebird 1.5 RC7 и искам да пълня таблица през View. Значи имам си View, "връзвам" се на Before insert и правя Insert към таблицата:
INSERT INTO TABLE1(
ID,
NAME)
VALUES(NEW.ID, NEW.NAME).
това нещо гърми като казва че има грешка в Primary KEY, тоест все едно че се опитвам да запиша едно и също ID 2 пъти(а се опитва да вкара 2 записа вместо 1 - незнам от къде му хрумва).
Интересувам се имам ли NEW (стойност на NEW) въобще тук. И въобще какъв е принципа за пълнене на таблица през View - от къде може да се про4ете?
(а пропуснах да отбележа че този код приложен директно върху таблицата работи, но трябва да стане с View)
Някой ако е правил нещо подобно нека сподели!
Благодаря предварително.
Светът е малък нека си помагаме.
имам следния проблем:
Ползвам Firebird 1.5 RC7 и искам да пълня таблица през View. Значи имам си View, "връзвам" се на Before insert и правя Insert към таблицата:
INSERT INTO TABLE1(
ID,
NAME)
VALUES(NEW.ID, NEW.NAME).
това нещо гърми като казва че има грешка в Primary KEY, тоест все едно че се опитвам да запиша едно и също ID 2 пъти(а се опитва да вкара 2 записа вместо 1 - незнам от къде му хрумва).
Интересувам се имам ли NEW (стойност на NEW) въобще тук. И въобще какъв е принципа за пълнене на таблица през View - от къде може да се про4ете?
(а пропуснах да отбележа че този код приложен директно върху таблицата работи, но трябва да стане с View)
Някой ако е правил нещо подобно нека сподели!
Благодаря предварително.
Светът е малък нека си помагаме.
Re: Firebird 1.5 Views trigger problem
>се опитва да вкара 2 записа вместо 1 - незнам от къде му хрумва
Вероятно точно така става
Не си показал вюто, но този ефект се получава, когато вюто е updateble. Сработва тригера на вюто, а след това се изпълнява и инсърт във физическата таблица.
Workaround:
Ако е само за този инсърт, който си показал, не ти трябва тригер на вюто. Сървъра ще го свърши вместо теб. Ако има някакви обработки, можеш да ги извършиш в тригер на таблицата.
Ако е нещо по-сложно, трябва да направиш вюто nonupdatable.
нещо подобно на.:
create view ... from MyTable, RDB$Database where ...
Има заявление, че този проблем е решен в FB2
* Re-worked logic of updatable views
This solves problems with views that are implicitly updatable, but still have update triggers
Вероятно точно така става
Не си показал вюто, но този ефект се получава, когато вюто е updateble. Сработва тригера на вюто, а след това се изпълнява и инсърт във физическата таблица.
Workaround:
Ако е само за този инсърт, който си показал, не ти трябва тригер на вюто. Сървъра ще го свърши вместо теб. Ако има някакви обработки, можеш да ги извършиш в тригер на таблицата.
Ако е нещо по-сложно, трябва да направиш вюто nonupdatable.
нещо подобно на.:
create view ... from MyTable, RDB$Database where ...
Има заявление, че този проблем е решен в FB2
* Re-worked logic of updatable views
This solves problems with views that are implicitly updatable, but still have update triggers
Редактирано от NDeu на
Blagodarq
Мерси NDeu,
по-рано днес се светнах, 4е ако View-to е върху една таблица - то автоматично се възприема като Updatable, но ако има агрегатни функции, Join,Distinct ... View-to се възприема като ReadOnly и тогава трябва да има тригери за манипулации(Insert/Update) на данните в таблиците.
Светът е малък нека си помагаме.
по-рано днес се светнах, 4е ако View-to е върху една таблица - то автоматично се възприема като Updatable, но ако има агрегатни функции, Join,Distinct ... View-to се възприема като ReadOnly и тогава трябва да има тригери за манипулации(Insert/Update) на данните в таблиците.
Светът е малък нека си помагаме.