Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизОбновляемое View Найти похожие ветки
← →
kombat (2002-11-07 18:28) [0]Привет всем! Помогите в решении проблемы. Есть две таблички
TOWN (
REC_ID T_INT_NOT_NULL NOT NULL,
NAME T_VARCHAR_128 NOT NULL
и
BANK (
REC_ID T_INT_NOT_NULL NOT NULL,
NAME T_VARCHAR_64 NOT NULL,
MFO T_VARCHAR_6 NOT NULL,
TOWN_ID T_INT_NOT_NULL NOT NULL
на них создается
CREATE VIEW NEW_VIEW(
BANK_NAME,
BANK_REC_ID,
TOWN_NAME,
TOWN_REC_ID)
AS
SELECT B.NAME AS BANK_NAME, B.REC_ID, T.NAME AS TOWN_NAME, T.REC_ID AS TOWN_REC_ID
FROM TOWN T, BANK B
WHERE T.REC_ID=B.TOWN_ID;
у него есть тригер
ALTER TRIGGER NEW_VIEW_BI
AS
DECLARE VARIABLE TMPI_TOWN_REC_ID INTEGER;
BEGIN
SELECT REC_ID FROM TOWN WHERE NAME=NEW.TOWN_NAME INTO :TMPI_TOWN_REC_ID;
IF (TMPI_TOWN_REC_ID IS NULL) THEN TMPI_TOWN_REC_ID=0;
IF (TMPI_TOWN_REC_ID=0) THEN BEGIN
TMPI_TOWN_REC_ID=GEN_ID(GEN_TOWN_ID, 1);
INSERT INTO TOWN (REC_ID, NAME) VALUES (:TMPI_TOWN_REC_ID, NEW.TOWN_NAME);
END
TMPI_TOWN_REC_ID=0;
INSERT INTO BANK (NAME, TOWN_ID) VALUES (NEW.BANK_NAME, :TMPI_TOWN_REC_ID);
END
у табличек кроме того на ключевые поля есть тригеры которые подставляют значения для ключевого поля REC_ID.
А проблема в том что при попытке провести следующий запрос INSERT INTO NEW_VIEW (BANK_NAME, TOWN_NAME, BANK_REC_ID, TOWN_REC_ID)
VALUES ("New_bank", "Kiev", 0, 0) просто отваливается соединение к базе.
Как бороться с этим, что я делаю неправильно?
← →
Kombat (2002-11-07 18:53) [1]И еще выдает такое
The cursor identified in the update or delete statement is not positioned on a row.
no current record for fetch operation.
attempted update of read-only column.
Как вообще сделать чтобы View был обновляемым, вроде делаю все как в доках FB
← →
Johnmen (2002-11-08 01:59) [2]Еще раз внимательно прочитать доки на предмет определения редактируемого вью...
А по поводу отваливающегося соединения - так ты не указал, как это соединение осуществляешь ! А телепатов, как уже неоднократно заявлялось в конфах, здесь нет !
← →
Виталий Панасенко (2002-11-08 08:45) [3]Просто обновляемый просмотр можно создать только используя ОДНУ таблицу
← →
Wolf226 (2002-11-08 10:11) [4]2 Виталий Панасенко.
Да хоть из 100 таблиц! Только тригера пропиши и все там обновляй.
Когда view из 1 таблицы тогда она сама обновляет, а иначе с помощью тригеров.
Кстати о птичках:
Если view из одной таблицы, а тебе нужно сделать встаку своим методом в тригере, то ты ее обманываешь так
select ID, name
from table1, rdb$database
← →
Wolf226 (2002-11-08 10:29) [5]Зачем? Вроде это вторичный ключ, а ты его в 0
TMPI_TOWN_REC_ID=0;
INSERT INTO BANK (NAME, TOWN_ID) VALUES (NEW.BANK_NAME, :TMPI_TOWN_REC_ID);
← →
kombat (2002-11-08 11:05) [6]Извиняюсь за неполный вопрос. Я использовал для коннекта к БД IBExpert 2.5.0.9, при использовании SQLExplorer (BDE 5.11) конект так же отлетает. FireBird 1.0 build 863. В доках написано что обновляемое View можно сделать только на одну таблицу, но если использовать тригеры, то можно обновлять любое количество таблиц. Что я и делаю
CREATE TRIGGER NEW_VIEW_BI FOR NEW_VIEW
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE TMPI_TOWN_REC_ID INTEGER;
BEGIN
SELECT REC_ID FROM TOWN WHERE NAME=NEW.TOWN_NAME INTO :TMPI_TOWN_REC_ID;
IF (TMPI_TOWN_REC_ID IS NULL) THEN TMPI_TOWN_REC_ID=0;
IF (TMPI_TOWN_REC_ID=0) THEN BEGIN
TMPI_TOWN_REC_ID=GEN_ID(GEN_TOWN_ID, 1);
INSERT INTO TOWN (REC_ID, NAME) VALUES (:TMPI_TOWN_REC_ID, NEW.TOWN_NAME);
END
TMPI_TOWN_REC_ID=0;
INSERT INTO BANK (NAME, TOWN_ID) VALUES (NEW.BANK_NAME, :TMPI_TOWN_REC_ID);
END
Если уменьшить строку Insert передавая меньше параметров, то конект не отваливается, но все равно не работает
При попытке редактировать в IBExpert View как табличку при Post вылетает
Invalid Token
Dinamic SQL Error
SQL Error Code -104
Token unknown - line 2, char 2. ).
Но видно это ошибка самого IBExpert
← →
kombat (2002-11-08 11:07) [7]to Wolf226 ©
там звучит так
IF (TMPI_TOWN_REC_ID=0) THEN BEGIN
TMPI_TOWN_REC_ID=GEN_ID(GEN_TOWN_ID, 1);
INSERT INTO TOWN (REC_ID, NAME) VALUES (:TMPI_TOWN_REC_ID, NEW.TOWN_NAME);
END
т.е. если нет записи в справочнике, то создаем её
← →
kombat (2002-11-08 11:11) [8]А вообще, уважаемы Мастера, этот цирк затеивается чтобы перенести БД из Access в Firebird. Но в Firebird используется новая структура, мы переносим туда данные и создаем View которые эмулируют старую структуру где это возможно, а страые приложения Access видят эти View как свои старые таблицы и работают дальше (не все они еще переведены на Делфи). Это попытка осуществить плавный переход. Может конечно это делается и иначе, но я пока другого способа не вижу
← →
Wolf226 (2002-11-08 11:54) [9]Про МФО забыл? Оно же not null.
← →
kombat (2002-11-08 12:58) [10]МФО нот нулл, но его домен сам подставляет " "
← →
Wolf226 (2002-11-08 13:16) [11]Мда...
у меня как-то был такой случай. Я создал процедуру, alter и отвалилось соединение.
Пришлось находить сбойный участок. Путем поочередного комментирования операторов. Но я нашел другой способ написать сбойный участок и стало все в порядке. Наверно баг самого сервера.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c