Дано: 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$$%';
А самое лучшее – проектировать последовательности, их использование и писать триггеры. Вычистил схему от этих артефактов, что всем и рекомендую.