Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
7-72548
DD
2002-11-05 00:47
2003.01.23
Как не через fdisk, а програмно установить активный раздел на HDD


7-72545
DimaK
2002-11-11 00:14
2003.01.23
Помогите разобраться с изменением разрешения экрана


4-72606
Evgeny
2002-12-06 10:54
2003.01.23
Файл CGI


14-72518
Max___
2003-01-06 14:14
2003.01.23
Чем Delphi 7 лучше Delphi 6?


3-72093
Big_Rom
2002-12-28 22:59
2003.01.23
Fastreport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский