Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Чудеса с представлениями! / 5 сообщений из 5, страница 1 из 1
26.02.2004, 16:35
    #32422913
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса с представлениями!
Чё-то не работает у меня конференция, поэтому заслать сюда решил.
Вот, значит, на какие грабли я наступил сегодня в FB1.5:

1) Если создать триггеры на представление, а потом пересоздать это представление командой RECREATE VIEW, то все триггеры этого представления исчезут.

2) Создал таблицу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE GENERATOR GEN_TAB_ID;
CREATE TABLE TAB (
    ID    INTEGER NOT NULL PRIMARY KEY,
    NAME  VARCHAR( 10 )
);
SET TERM ^ ;
CREATE TRIGGER TAB_BI FOR TAB
ACTIVE BEFORE INSERT POSITION  0 
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_TAB_ID, 1 );
END
^

Потом создал на неё простейшее представление и триггер на неё:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE VIEW V AS SELECT * FROM TAB;
SET TERM ^ ;
CREATE TRIGGER V_AI0 FOR V
ACTIVE AFTER INSERT POSITION  0 
AS
  DECLARE I INT;
BEGIN
  I=NEW.ID;
END^

Здесь MSG - это моя функция, которая выводит окошко с полученным значением.

В результате я выяснил что если вставлять данные через представление, то в триггере после вставки представления значение NEW.ID будет равно NULL несмотря на то, что триггер на таблице вставил в таблицу данные с совершенно другим значеним.

Хотелось бы услышать ваше мнение обо всём этом.
...
Рейтинг: 0 / 0
26.02.2004, 17:10
    #32423050
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса с представлениями!
Commit делал?
...
Рейтинг: 0 / 0
26.02.2004, 17:14
    #32423064
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса с представлениями!
Ой, с COMMIT вопрос снимается - ни селу ни к городу...

Твой триггер на вьюху должен ЗАНОСИТЬ данные в физическую таблицу.
И все.

Ну, потом - COMMIT, конечно.
...
Рейтинг: 0 / 0
27.02.2004, 10:03
    #32423696
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса с представлениями!
1) Это удивляет? RECREATE - это аналог пары DROP+CREATE. А при DROP таблицы или вьюхи сервер всегда удаляет триггеры.

2) Во-первых, подтвердить не удалось. У меня в триггер вьюхи передается правильное значение. Во-вторых, не надо писать такие вещи. В FB2 это уже не работает. Триггер на вьюху должен сам вставлять данные в таблицу. Т.е. для представлений триггера работают как INSTEAD OF, независимо от того, объявлены они как BEFORE или AFTER. Текущее поведение, когда сервер делает вставку в таблицу сам, есть злостный борландовский артефакт. Если хочешь правильного поведения сервера, делай вьюху так:

CREATE VIEW V AS SELECT TAB.* FROM TAB JOIN RDB$DATABASE ON 1 = 1;

и строй свою логику соответственно. Это делает вьюху необновляемой и сервер самостоятельностью не занимается, только вызывает триггеры. Иначе потом нарвешся на грабли.
...
Рейтинг: 0 / 0
27.02.2004, 13:32
    #32424183
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса с представлениями!
По поводу того что у вас не воспроизводиться 2) - у меня воспроизводиться на RC9 - только что ещё раз проверил...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Чудеса с представлениями! / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]