Drop и Create индекса на Primary key

Появилась задача — Drop и Create индекса на Primary key (Именно такое потенциальное решение, из всех других предложенных вариантов, остаётся для Internal error ORA 600 [kdsgrp1] по рекомендации MOS)

Alter table "ARDOME"."RUNDOWN_ROW" drop primary key
Error report -
SQL Error: ORA-02273: denna UNIQUE/PRIMARY KEY refereras från några främmande nycklar
02273. 00000 - "this unique/primary key is referenced by some foreign keys"
*Cause: Self-evident.
*Action: Remove all references to the key before the key is to be dropped.

I. Давайте определим имя PK при помощи представления DBA_CONSTRAINTS:

В нашем случае это таблица RUNDOWN_ROW в схеме ARDOME.
select CONSTRAINT_NAME from DBA_CONSTRAINTS
where OWNER like 'ARDOME' and Table_name like 'RUNDOWN_ROW'
and CONSTRAINT_TYPE='P'

Типы констрейнтов:

  • C (check constraint on a table)
  • P (primary key)
  • U (unique key)
  • R (referential integrity) — он же FK, который ссылаясь мешает удалить PK
  • V (with check option, on a view)
  • O (with read only, on a view)

Немного подшаманим и увидим информацию о FK на наш PK:
select * from DBA_CONSTRAINTS
where R_CONSTRAINT_NAME in (
select CONSTRAINT_NAME from DBA_CONSTRAINTS
where OWNER like 'ARDOME' and Table_name like 'RUNDOWN_ROW' and CONSTRAINT_TYPE='P')

II. Простым Disable тут не обойтись, потому будем удалять Внешние Ключи. Что бы их восстановить нам нужно снять DDL запрос:
select dbms_metadata.get_ddl('REF_CONSTRAINT', c.constraint_name,'ARDOME') from DBA_CONSTRAINTS c where
c.constraint_name in(
select constraint_name from DBA_CONSTRAINTS
where R_CONSTRAINT_NAME in (
select CONSTRAINT_NAME from DBA_CONSTRAINTS
where OWNER like 'ARDOME' and Table_name like 'RUNDOWN_ROW' and CONSTRAINT_TYPE='P')
)

+DDL для нашего PK (не покажет primary key constraint for IOT)
select dbms_metadata.get_ddl('CONSTRAINT', c.constraint_name,'ARDOME') from DBA_CONSTRAINTS c where c.CONSTRAINT_NAME in
(select CONSTRAINT_NAME from DBA_CONSTRAINTS
where OWNER like 'ARDOME' and Table_name like 'RUNDOWN_ROW' and CONSTRAINT_TYPE='P')

 

В результате получили такие инструкции:

ALTER TABLE "ARDOME"."RUNDOWN_ITEM" ADD CONSTRAINT "RDI_RDR_ID_FK" FOREIGN KEY ("RDI_RDR_ID")
REFERENCES "ARDOME"."RUNDOWN_ROW" ("RDR_ID") ON DELETE CASCADE ENABLE

ALTER TABLE "ARDOME"."RUNDOWN_COMPOUND" ADD CONSTRAINT "RDC_RDR_ID_FK" FOREIGN KEY ("RDC_RDR_ID")
REFERENCES "ARDOME"."RUNDOWN_ROW" ("RDR_ID") ON DELETE CASCADE ENABLE

ALTER TABLE "ARDOME"."RUNDOWN_ROW" ADD PRIMARY KEY ("RDR_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "TS4K" ENABLE

 

III. Теперь сгенерируем запросы на удаление FK и PK:

--для удаления внешних ключей
SELECT 'ALTER TABLE '||OWNER||'.'||Table_name||' DROP CONSTRAINT '||CONSTRAINT_NAME||';' from DBA_CONSTRAINTS
where R_CONSTRAINT_NAME in (
select CONSTRAINT_NAME from DBA_CONSTRAINTS
where OWNER like 'ARDOME' and Table_name like 'RUNDOWN_ROW' and CONSTRAINT_TYPE='P')
UNION ALL -- для удаления первичного ключа
SELECT 'ALTER TABLE '||OWNER||'.'||Table_name||' DROP CONSTRAINT '||CONSTRAINT_NAME||';' from DBA_CONSTRAINTS
where OWNER like 'ARDOME' and Table_name like 'RUNDOWN_ROW' and CONSTRAINT_TYPE='P'

 

Получили:
ALTER TABLE ARDOME.RUNDOWN_ITEM DROP CONSTRAINT RDI_RDR_ID_FK;
ALTER TABLE ARDOME.RUNDOWN_COMPOUND DROP CONSTRAINT RDC_RDR_ID_FK;
ALTER TABLE ARDOME.RUNDOWN_ROW DROP CONSTRAINT SYS_C0023447;

N.B. Лучше стоит заранее посмотреть, нет ли зависимостей у удаляемых констрейнтов, что бы во время проведения работ не было неприятных неожиданостей.

Заключение.
Настало время работ… Что бы избежать блокировок  и других потенциальных проблем будем работать с БД в режиме ограниченного доступа:

ALTER SYSTEM ENABLE RESTRICTED SESSION;
Выполняем результаты запроса из пункта III.
Выполняем результаты запроса из пункта II.
ALTER SYSTEM DISABLE RESTRICTED SESSION;

Update: Вышеуказанные действия не помогли избавиться от проблемы.
Oracle выпустил спец. патч для нашей платформы:

«Patch 16698629: ORA-600[KDSGRP1] OCCURRED WHILE EXECUTING SELECT TO PARTITION TABLE
Prerequisite Patches
24006111 DATABASE PATCH SET UPDATE 11.2.0.4.161018»

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *