Форум: "Базы";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];
ВнизUpdatable view... Найти похожие ветки
← →
kaif (2002-12-29 15:29) [0]Неужели нельзя никак заставить IB6.0 (Firebird,Yaffils) создать updatable view с select-ом из нескольких таблиц сразу. Я готов прописать в триггерах все нужные insert, update и delete в несколько таблиц. Пусть сам view этим как бы не занимается , а лишь вызывает свои триггеры...
В документации написано, что это невозможно. Эмпирически я тоже вижу, что невозможно. Но почему? Неужели нельзя как-то обмануть IB?
И почему такое строгое ограничение?
← →
Sergey Masloff (2002-12-29 16:35) [1]>В документации написано, что это невозможно.
Где именно? Документ в студию!
>Эмпирически я тоже вижу, что невозможно.
Вы придерживаетесь эмпиризма как философского направления? Или просто хотели сказать "попробовал и не получилось..."? Выражайтесь яснее.
Что мешает создать такой триггер? В IB 5.x я их использовал довольно часто. Сейчас необходимости нет, но для интереса попробовал и в Firebird 1.0 тоже вроде работает...
← →
kaif (2002-12-30 05:55) [2]A view is updatable if:
It is a subset of a single table or another updatable view.
All base table columns excluded from the view definition allow NULL values.
.....
If the view definition does not meet these conditions, it is considered read-only.
Note Read-only views can be updated by using a combination of user-defined referential
constraints, triggers, and unique indexes.
Последние две фразы несколько сбивают с толку.
Потому я и задал этот вопрос.
Я попробовал создать триггер BEFORE INSERT и в нем вставить записи в 3 исходные таблицы, из которых собирается VIEW.
Потом я попытался запустить INSERT INTO VIEW...
Однако сервер ругается.
2 Sergey Masloff (29.12.02 16:35)
Если Вы это удачно проделывали, это меня вдохновит на новые поиски того, в чем, собственно загвоздка.
Тогда вопрос поставлю иначе.
В каком триггере мне прописать INSERT, в триггере
1. ACTIVE BEFORE INSERT или
2. ACTIVE AFTER INSERT
Буду признателен за ответ.
← →
kaif (2002-12-30 07:20) [3]Только сейчас я нашел в Data Definition Guide, как работать с ReadOnly View. Прошу прощения. Но оказывается я все делал верно.
Создал View и триггер BEFORE INSERT.
Проблема, как выясняется вот в чем:
Если в объединении участвуют 2 таблицы и я делаю вставку в триггере в обе, то все работает.
Если же в объединении появляется третья (справочная таблица), в которую вставку делать не нужно, то сервер сообщает об ошибке.
Вот мой View:
CREATE VIEW VIEW_FIRM(ID, FIRM_KIND, FIRM_KIND_SHORT_NAME, NAME)
AS
SELECT
CONTRAGENT.ID,
FIRM.FIRM_KIND,
O1.SHORT_NAME,
FIRM.NAME
FROM
CONTRAGENT,
FIRM,
OBJECT_NAMES O1
WHERE
CONTRAGENT.ID=FIRM.ID AND
FIRM.FIRM_KIND=O1.OBJECT_ID
Вот триггер вставки:
CREATE TRIGGER VIEW_FIRM_INSERT FOR VIEW_FIRM
ACTIVE BEFORE INSERT
AS
BEGIN
INSERT INTO CONTRAGENT(ID) VALUES (NEW.ID);
INSERT INTO FIRM(ID, FIRM_KIND, NAME)
VALUES (NEW.ID, NEW.FIRM_KIND, NEW.NAME);
END
Вот вставка:
insert into view_firm (id, firm_kind, name)
values (gen_id(object_id_gen, 1), 1, "my firm")
Сообщение сервера:
no current record for fetch operation
attempted update of read-only column
---------------
Если из View убрать объединение с таблицей OBJECT_NAMES, то все работает:
CREATE VIEW VIEW_FIRM(ID, FIRM_KIND, NAME)
AS
SELECT
CONTRAGENT.ID,
FIRM.FIRM_KIND,
FIRM.NAME
FROM
CONTRAGENT,
FIRM
WHERE
CONTRAGENT.ID=FIRM.ID
Такой View нормально принимает INSERT в триггере.
Однако мне нужно объединение со справочной таблицей тоже.
Что предпринять - не знаю.
← →
kaif (2002-12-30 07:34) [4]Нашел, как заставить это работать.
Я просто придал "вычисляемый" характер полю FIRM_KIND_SHORT_NAME,
добавив туда конкатенацию:
CREATE VIEW VIEW_FIRM(ID, FIRM_KIND, FIRM_KIND_SHORT_NAME, NAME)
AS
SELECT
CONTRAGENT.ID,
FIRM.FIRM_KIND,
O1.SHORT_NAME||"",
FIRM.NAME
FROM
CONTRAGENT,
FIRM,
OBJECT_NAMES O1
WHERE
CONTRAGENT.ID=FIRM.ID AND
FIRM.FIRM_KIND=O1.OBJECT_ID
=====================
Все заработало. Большое спасибо Sergey Masloff (29.12.02 16:35)
за информацию о том, что это вообще может работать.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c