Я работаю над Oracle11g и пытаюсь переопределить таблицу с помощью dbms_redefinition .Это работает нормально, но при попытке удалить промежуточную таблицу выдает ошибку ORA-02449: unique/primary keys in table referenced by foreign keys
.
Я нашел запрос для поиска ссылок прямо здесь, в SO,
select table_name, constraint_name, status, owner
from all_constraints
where r_owner = 'MYSCHEMA'
and constraint_type = 'R'
and r_constraint_name in
(
select constraint_name from all_constraints
where constraint_type in ('P', 'U')
and table_name = 'INTERIM_TABLE'
and owner = 'MYSCHEMA'
)
order by table_name, constraint_name
, который дает
table_name |constraint_name |status |owner
---------------------------------------------------------
anotherTable|TMP$$_anotherTable_JOB_ID0|DISABLED|MYSCHEMA
Я полагаю, что это ограничение было создано в процессе переопределения, это нормально, но я также ожидал, что оно должно быть удалено тем же процессом.Это неправильно?Я говорю, является ли частью нормального поведения, что это ограничение не было удалено?
Безопасно просто удалить ограничение с помощью
alter table anotherTable
drop constraint TMP$$_anotherTable_JOB_ID0
без потери данных?
Заранее спасибо.
- РЕДАКТИРОВАТЬ -Подумав об этом, я решил просто удалить ограничение, чтобы разрешить удаление промежуточной таблицы.
Я изменил запрос, чтобы удалить ограничения других таблиц, которые указывают на таблицы, которые я хочуdrop, почти автоматически.
DECLARE
my_table varchar2(100);
my_constraint varchar2(100);
BEGIN
select table_name , constraint_name into my_table,my_constraint
from all_constraints
where r_owner = 'MYSCHEMA'
and constraint_type = 'R'
and r_constraint_name in
(
select constraint_name from all_constraints
where constraint_type in ('P', 'U')
and table_name = 'INTERIM_TABLE'
and owner = 'MYSCHEMA'
)
order by table_name, constraint_name;
execute immediate 'ALTER TABLE '||my_table||' DROP CONSTRAINT '|| my_constraint;
END;
/
DROP TABLE MYSCHEMA.INTERIM_TABLE;
Это сработало для меня, но я должен отметить, что в моем случае этот запрос выбрасывает только одну строку (только одну зависимую таблицу), поэтому его необходимо изменить, чтобы отбрасывать многиецикл или другой метод, если вы кого-то знаете.
Было бы хорошо, если бы кто-то смог выяснить и объяснить, почему это ограничение не было удалено самим процессом (или если это нормальное поведение).