Firebird 1.5 Views trigger problem

2 отговора 178 прегледа
#1

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)

Някой ако е правил нещо подобно нека сподели!

Благодаря предварително.

Светът е малък нека си помагаме.
Отговор
в отговор на Vermax #2

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

Редактирано от NDeu на

Отговор
в отговор на NDeu #3

Blagodarq

Мерси NDeu,

по-рано днес се светнах, 4е ако View-to е върху една таблица - то автоматично се възприема като Updatable, но ако има агрегатни функции, Join,Distinct ... View-to се възприема като ReadOnly и тогава трябва да има тригери за манипулации(Insert/Update) на данните в таблиците.

Светът е малък нека си помагаме.
Отговор