Май 242012
 

При удалении некоторых пакетов или при каскадном удалении пользователя, иногда можно словить ошибки подобного вида:

SQL> drop user cube cascade;
drop user cube cascade
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-04043: object SYS_PLSQL_735489_19_2 does not exist

Бороться с ними просто. Сначала найдём все системные типы, создаваемые для нашего объекта:

SELECT type_name FROM dba_types 
	WHERE type_name LIKE 'SYS_PLSQL_735489%';
-- Удалим найденные типы
DROP TYPE cube.SYS_PLSQL_734661_224_1;
-- и все остальные, которые 
-- получится удалить

И удалим эти типы вручную. После этого пакет должен удалиться нормально.
При каскадном удалении пользователя подобных объектов может быть много, и поэтому неплохо бы избавиться от всех разом. Используем проверенный приём, сгенерируем скрипт для дропания этих системных типов:

SELECT 'drop type cube.' || type_name || ';', typecode 
FROM dba_types 
WHERE type_name LIKE 'SYS_PLSQL%'
	  AND owner = 'CUBE';

Эту выборку нужно совершать и прогонять результирующий скрипт до того, пока количество возвращаемых строк не станет постоянным. После этого, несмотря на то, что несколько системных типов останется, каскадное удаление пользователя пройдёт нормально.

Кстати, если рассмотреть имя объекта из примера, можно увидеть, что все системные типы, ассоциированные с удаляемым пакетом, имеют в своём имени несколько чисел. Первое из них (в нашем примере это 735489) является object_id удаляемого пакета, т.е. найти этот самый пакет не составит труда:

SELECT * 
FROM dba_objects d
WHERE d.object_id = 735489;

Такая вот внутренняя кухня.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)