Базы данных Oracle - статьи

         

Плата за свободный проход или эволюция типов


К сожалению объектные свойства дают разработчику не только приятные моменты. Одной из оборотных сторон является сложность, более высокая, чем при работе с таблицами. В жизни далеко не всегда получается придумать схему данных правильно и сразу, и оставить будущему только работу с самими данными. Часто приходится вносить изменения в схему при наличии уже имеющихся данных. Тут-то объектный подход и обнаружит больше затруднений, чем поначалу могло бы хотеться.

Выше упоминалась содержательно некорректная возможность добавить в таблицу CHECKPOINT сотрудника Scott, для которого не указано, то ли он доктор, то ли принадлежит обслуживающему персоналу. Говорилось, как можно исправить ситуацию, придав типу EMPLOYEE_TYP свойство NOT INSTANTIABLE. Если мы захотим сделать это сейчас, то у нас ничего не выйдет:

SQL> ALTER TYPE employee_typ NOT INSTANTIABLE; ALTER TYPE employee_typ NOT INSTANTIABLE * ERROR at line 1: ORA-22327: cannot change a type to NOT INSTANTIABLE if
it has dependent tables

К сожалению дело не в том, что в таблице CHECKPOINT отмечен сотрудник, противоречащий изменению свойства типа EMPLOYEE_TYP. Сообщение об ошибке говорит, что изменение свойства типа INSTANTIABLE на NOT INSTANTIABLE возможно лишь при отсутствии таблиц с полями этого типа. Увы, но нам придется пожертвовать таблицей:

DROP TABLE CHECKPOINT;

ALTER TYPE employee_typ NOT INSTANTIABLE CASCADE;

Кроме того, поскольку у EMPLOYEE_TYP есть подтипы, потребовалось указать слово CASCADE, чтобы изменения распространились на них (можете проверить, что указание CASCADE не спасет ситуацию с ошибкой ORA-22327 выше).

К счастью обратное изменение свойства типа, с NOT INSTANTIABLE на INSTANTIABLE, не потребует никаких жертв и срабатывает всегда.



Содержание раздела