2016-01-22 8 views
0

У меня есть таблица с ПК, которая используется как FK в нескольких таблицах. Я должен отбросить родительскую таблицу из-за проблемы, которую я имею, но это не позволит мне из-за FK. Я пытаюсь отбросить PK и UK из родительской таблицы, и это говорит о том, что есть таблицы, которые все еще используют их. Я даже отключил FK на нескольких таблицах и попытался удалить таблицу, ПК и Великобританию, и он все еще говорит, что к ним привязаны таблицы.переименовать или отключить внешний ключ оракула, чтобы удалить родительскую таблицу

Есть ли способ удалить родительскую таблицу в оракуле, а затем воссоздать ее с помощью тех же ПК и Великобритании без необходимости удаления FK из нескольких таблиц?

Спасибо

+0

Вы отключили FKs на дочерние таблицы? – OldProgrammer

+0

Почему вы хотите воссоздать таблицу? Вы можете внести любые изменения, используя команду 'alter table'. – Dmitry

+0

Я переименовал его, потому что я хотел убедиться, что я не потерял данные. Мне следовало бы лучше подойти. –

ответ

0

Есть ли способ, что я могу упасть родительскую таблицу оракула, а затем воссоздать его с точно такой же ПК и Великобритании без необходимости удаления FK из нескольких таблиц?

Да, вы используете DBMS_REDEFINITION. Вы можете использовать dbms_redefinition делать то, что вам нужно сделать, как часть этого «исправления»: восстановить таблицу, добавить/удалить столбцы, изменить порядок столбцов, добавить перегородки и т.д.

Единственное, что вы не можете действительно do - это изменение структуры первичного ключа. Но, если бы вы делали это, у вас все равно оставалось бы FK.

Вот краткий пример:

-- Create a parent/child relationship with data.... 
CREATE TABLE matt_parent 
(
    id  NUMBER, 
    value1 VARCHAR2 (30), 
    CONSTRAINT matt_parent_pk PRIMARY KEY (id) 
); 

CREATE TABLE matt_child 
(
    id   NUMBER, 
    parent_id NUMBER, 
    value2  VARCHAR2 (30), 
    CONSTRAINT matt_child_pk PRIMARY KEY (id), 
    CONSTRAINT matt_child_fk1 FOREIGN KEY (parent_id) REFERENCES matt_parent (id) 
); 

insert into matt_parent values (1, 'XXX'); 

insert into matt_child values (100, 1, 'YYY'); 

COMMIT; 

-- These next few SQLs use online redefinition to change the parent table (adding a column and adding partitioning) 
-- First, have Oracle check whether redefinition is going to work 
BEGIN 
DBMS_REDEFINITION.CAN_REDEF_TABLE('apps','matt_parent', 
     DBMS_REDEFINITION.CONS_USE_ROWID); 
END; 
/

-- Second, create our rebuilt table. It eventually replaces our current table. 
CREATE TABLE apps.matt_parent_redef 
    ( 
    id  NUMBER, 
    date1 DATE, 
    value1 VARCHAR2 (30) 
) 
PARTITION BY RANGE (date1) 
INTERVAL (NUMTODSINTERVAL (1,'DAY')) (partition parent_old values less than (to_date('01-JAN-2000','DD-MON-YYYY'))); 
; 

-- Run this if you need to start over... 
--BEGIN 
--DBMS_REDEFINITION.ABORT_REDEF_TABLE (
-- uname => 'apps', 
-- orig_table => 'matt_parent', 
-- int_table => 'matt_parent_redef'); 
--END; 


-- Third, tell Oracle to start the redefinition process. Can take long -- copies all the data into our new table 
BEGIN 
DBMS_REDEFINITION.START_REDEF_TABLE('apps', 'matt_parent','matt_parent_redef', 
     'id, sysdate date1, value1', 
     dbms_redefinition.cons_use_rowid); 
END; 
/

-- Fourth, tell Oracle to copy dependent objects like PK constaints, FKs, grants, etc 
DECLARE 
num_errors PLS_INTEGER; 
BEGIN 
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('apps', 'matt_parent','matt_parent_redef', 
    DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors); 

    DBMS_OUTPUT.PUT_LINE('Copy depenedent objects: num_errors = ' || num_errors); 
END; 


-- Fifth, query to make sure there were no problems. This should return no rows 
select * from   DBA_REDEFINITION_ERRORS where base_table_name = 'MATT_PARENT'; 


-- Sixth, tell Oracle we're finished. This *briefly* locks the table as the switch is accomplished. 
BEGIN 
DBMS_REDEFINITION.FINISH_REDEF_TABLE('apps', 'matt_parent', 'matt_parent_redef'); 
END; 
/

-- Later, drop the redefinition version of the table. 
DROP TABLE apps.matt_parent_redef CASCADE CONSTRAINTS; 

-- Try to delete some parent data, just to verify our FKs are still in force. 
delete from matt_parent where id = 1; 
+0

Спасибо, Мэтью. Проблема в том, что у меня нет полных прав администратора. Я закончил отключать ограничения во всех таблицах зависимостей, а затем использовал переименованную таблицу и удостоверился, что у меня есть правильные первичные и внешние ключи. –

 Смежные вопросы

  • Нет связанных вопросов^_^