Форум: "Базы";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
ВнизОткат группы изменений в БД Найти похожие ветки
← →
VadimKV (2004-12-09 10:15) [0]Работаю в Delphi7 с БД FB1.5 через компоненты DBExpress.
Подскажите если кто знает.
Как сделать откат группы изменений в БД.
Например:
....
/*Добавление нового поля*/
ALTER TABLE t1 ADD f4 "INT";
/*Заполнение поля*/
UPDATE t1 SET f4 = 1;
/*Создание внешнего ключа*/
ALTER TABLE t1 ADD CONSTRAINT FK_t1
FOREIGN KEY (f4) REFERENCES t2(f1);
/*Добавление Уникально ограничения*/
ALTER TABLE t1 ADD CONSTRAINT UC_t1_f2 UNIQUE (f2)
....
Если в каком либо месте произошла ошибка, то мне необходимо отменить все изменения.
← →
Val © (2004-12-09 10:23) [1]Насколько я помню - в ИБ изменение метаданных также нужно коммитить(если не включен autocommit), т.е. по идее, достаточно стандартного
begin
...
Commit
except
RollBack
end;
← →
Johnmen © (2004-12-09 10:26) [2]>Если в каком либо месте произошла ошибка, то мне необходимо
>отменить все изменения.
В данном случае это принципиально невозможно. Т.к. в рамках одной транзакции можно менять либо только метаданные, либо только не их...
← →
VadimKV (2004-12-09 10:33) [3]Можно ли сделать какую нибудь "Большую" транзакцию, а все изменения которые необходимо совершить сделать как вложенные транзакции.
И в случае ошибки сделать откат Первой ("Большой"), что бы она откатила все вложенные?
← →
Val © (2004-12-09 10:37) [4]Лучше отделите изменение данных от метаданных, если при попытке изменения метаданных произойдет откат, то и изменить данные вы не сможете в данном случае (такого поля попросту не будет), т.е. тоже получите откат.
← →
VadimKV (2004-12-09 10:43) [5]Отделить не получится.
Последующей причине.
Если происходит добавление поля (F4) к не пустой таблице и необходимо по этому полю создать Внешний ключ (FK_t1), то это поле (F4)необходиом сначало заполнить данными чтобы не нарушалась ссылочная целостность данных.
← →
Val © (2004-12-09 10:48) [6]при пустом поле нарушится ссылочная целостность?
← →
Zacho © (2004-12-09 10:54) [7]VadimKV (09.12.04 10:43) [5]
Так не выйдет.
1. В IB нет вложенных транзакций
2. Невозможно в одной транзакции создать метаданные и заполнить их данными, перед работой с объектами БД, транзакция, в к-рой они создавались должна быть завершена.
Пересматривай логику работы приложения.
Johnmen © (09.12.04 10:26) [2]
Т.к. в рамках одной транзакции можно менять либо только метаданные, либо только не их...
Ну, не совсем так :) В одной тр-ции можно создать одну таблицу и работать с данными другой :)
← →
Johnmen © (2004-12-09 10:58) [8]>Zacho © (09.12.04 10:54) [7]
Да. Просто недостаточно внятно подчеркнул В данном случае
:)
← →
Johnmen © (2004-12-09 11:01) [9]http://sql.ru/forum/actualthread.aspx?tid=144575
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c