Каскадное удаление записей в Oracle 8.1.7
От: SergSV Россия  
Дата: 04.02.03 10:15
Оценка:
День добрый !

Есть сервер с Windodws NT 4 EE и Oracle 8.1.7. Создаем две таблицы :
Master (главная) и Detail (подчиненная). Вопрос состоит в следующем:
записываются ли при каскадном удалении записи из таблицы Detail
в сегмент отката или нет и можно ли будет удаленные записи из таблицы Detail
потом восстановить ?

-------------------------------------------
С уважением, Соколов С. В.
Re: Каскадное удаление записей в Oracle 8.1.7
От: Sergey Ten http://www.fastalgo.com
Дата: 06.02.03 09:10
Оценка:
Здравствуйте, SergSV, Вы писали:

SSV> Есть сервер с Windodws NT 4 EE и Oracle 8.1.7. Создаем две таблицы :

SSV>Master (главная) и Detail (подчиненная). Вопрос состоит в следующем:
SSV>записываются ли при каскадном удалении записи из таблицы Detail
SSV>в сегмент отката или нет и можно ли будет удаленные записи из таблицы Detail
SSV>потом восстановить ?

Данные из таблицы detail в rollback, безусловно, записываются. Проверить это легко:

Создаем схему:

create table master as select object_id from all_objects;

create table detail (object_id) as select object_id from master;

alter table master add constraint m_pk primary key (object_id);

alter table detail add constraint md_fk 
foreign key (object_id) references master(object_id)
on delete cascade;



Заносим данные:

insert into detail select * from detail;
insert into detail select * from detail;



Проверяем, сколько места они заняли:

SQL> select bytes / 1024 from dba_segments where segment_name in ('MASTER', 'DETAIL');

BYTES/1024
----------
       256
       768


Создаем rollback segment, достаточный только для того, чтобы вместить удаление из master (удвоим размер master, чробы быть уверенными, что для него точно места хватит, но не для detail-а):

create rollback segment rbs_masteronly
storage (initial 256K minextents 2 maxextents 2)
tablespace rbs;

alter rollback segment rbs_masteronly oline;


Завершаем эту транзакцию, чтобы в новой явно указать, какой rollback segment использовать:

commit;
set transaction use rollback segment rbs_masteronly;


Удаляем:

delete from master;


Результат не заставил себя ждать:

ERROR at line 1:
ORA-01562: failed to extend rollback segment number 8
ORA-01628: max # extents (2) reached for rollback segment RBS_MASTERONLY


Данные из detail не влезли в rollback.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.