ORA-32794 “cannot drop a system-generated sequence” – неудаляемые последовательности в Oracle

Дано: Oracle 19c, создана таблица, Primary key объявлен как “NUMBER GENERATED ALWAYS AS IDENTITY”.

После удаления таблицы в схеме сохраняются неудаляемые объекты sequence с именами типа “ISEQ$$_87167”.

При попытке удаления появляется ошибка:

Error code: ORA-32794 Description: cannot drop a system-generated sequence Cause: An attempt was made to drop a system-generated sequence. Action: A system-generated sequence, such as one created for an identity column, cannot be dropped.

а в SQL Developer еще и локализованная:

Error report -
ORA-32794: невозможно удалить созданную системой последовательность
32794.0000 - "cannot drop a system-generated sequence"
*Cause: An attempt was made to drop a system-generated sequence.
*Action: A system-generated sequence, such as one created for an
identity column, cannot be dropped

Что не работает

Воспроизведем ошибку, создадим таблицу:

CREATE TABLE ID_TEST (
id NUMBER GENERATED ALWAYS AS IDENTITY,
col_notes VARCHAR2(100) NOT NULL
);

Убедимся что создана последовательность для этой таблицы:

SELECT data_default AS sequence_val
,table_name
,column_name
FROM all_tab_columns
WHERE OWNER = 'ELEARN'AND TABLE_NAME = 'ID_TEST'
AND identity_column = 'YES';

"ELEARN"."ISEQ$$_87167"

Имя последовательности для столбца ID таблицы ID_TEST = ISEQ$$_87167

Удалим таблицу

DROP TABLE ID_TEST;
Table ID_TEST dropped.

Последовательность сохранена:

SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'ISEQ$$_87167'
ISEQ$$_87167 1

Удалим её, раз уж таблицы нет:

DROP SEQUENCE 'ISEQ$$_87167'
Error starting at line : 1 in command -
DROP SEQUENCE
ISEQ$$_87167
Error report -
ORA-32794: невозможно удалить созданную системой последовательность
32794.0000 - "cannot drop a system-generated sequence"
*Cause: An attempt was made to drop a system-generated sequence.
*Action: A system-generated sequence, such as one created for an
identity column, cannot be dropped.

И это правильно. Объекты, использующие последовательность могут быть восстановлены и для них хранится состояние идентификатора.

Решение

Принудительно очистить схему от неиспользуемых автоматически создаваемых последовательностей можно очистив корзину и выполнив commit.

PURGE RECYCLEBIN; 
COMMIT;

Последовательность удалена вместе с удалением из корзины объекта к которому она относилась:

SELECT COUNT(SEQUENCE_NAME) FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'ISEQ$$_87167'
0

 

Дополнителнение.

Проверить наличие в схеме столбцов с “GENERATED ALWAYS AS IDENTITY” и последовательностей.

SELECT * FROM USER_TAB_IDENTITY_COLS;
SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME LIKE 'ISEQ$$%';

А самое лучшее – проектировать последовательности, их использование и писать триггеры. Вычистил схему от этих артефактов, что всем и рекомендую.

Close Menu