2017-05-24 1 views
0

Ist es möglich, ON DELETE CASCADE einem Fremdschlüssel hinzuzufügen, der bei Verwendung von PARTITION BY REFERENCE als Partitionierungsschlüssel verwendet wird? Ich spreche von einem bereits aussteigenden Tisch.Oracle: Hinzufügen von DELETE CASCADE zu Fremdschlüssel in Partition per Referenz

Meine Lösung wäre, die Einschränkung zu löschen und neu zu erstellen, aber es funktioniert nicht, da ich eine Einschränkung, die von PARTITION BY REFERENCE verwendet wird, nicht löschen kann.

ich SQL-Fehler: ORA-14650: Betrieb nicht als Referenz-partitionierten Tabellen unterstützt

Oracle 11g.

drop table y; 
drop table x; 
create table x (a number primary key) partition by hash (a); 
create table y (a number not null, 
    constraint y_x_fk foreign key(a) references x(a)) 
    partition by reference(y_x_fk); 
alter table y drop constraint y_x_fk; 
+0

etwas, das ich nicht bekommen: Sie wollen die y_x_fk-Bedingung in die Delete-Kaskade zu ändern? Und Sie sagen, Sie können es nicht löschen? Bist du sicher? –

+0

Ja, ich bekomme ORA-14650, wenn ich versuche, die Einschränkung zu löschen. Die Tabelle wird durch Verweis partitioniert, und dieser FK ist der Partitionsschlüssel, und Sie können eine solche Einschränkung nicht einfach löschen. – rattaman

Antwort

0

Ich glaube, es in ALTER...MODIFY zu einer Inline-Option keine Option ist, um die noch vorhandene Zwang Kaskade zu machen; Ich denke, dass Sie in der Tat fallen und neu erstellen müssen, oder gleichwertig.

Ich stimme auch zu, es sieht so aus, als ob es keine saubere Möglichkeit gibt, eine Partition-Referenz-Einschränkung entweder zu löschen und neu zu erstellen; Ich glaube, du wirst einer Neudefinition gegenüberstehen, um dorthin zu gelangen.

Erschwerend kommt hinzu, es sieht aus wie die DBMS_REFEFINITION Verbesserungen in 12c werden Sie nicht dort in einem netten Ein-Schritt-REDEF, als DBMS_REDEFINITIONdoesn't support Referenz Partitionierung.

Ich denke, Sie müssen eine Old-School-Rede machen. (Es könnte immer noch wert sein, einige DBMS_REDEFINITION mit einem handgefertigten Ersatz zu versuchen, aber ich wäre für mindestens ein bisschen Ausfallzeit bereit).

Ein Ansatz wie im folgenden Beispiel könnte Sie dorthin bringen (mit Ausfallzeiten). Abhängig von Ihren Verfügbarkeitsanforderungen können andere Ansätze die Ausfallzeit in diesem Beispiel minimieren.

eine Ersetzungstabelle Machen Sie mit dem gewünschten CASCADING FK:

create table y_temp (a number not null, 
    constraint y_temp_x_fk foreign key(a) references x(a) ON DELETE CASCADE) 
partition by reference(y_temp_x_fk); 

Dann read-only gehen:

ALTER TABLE X READ ONLY; 
ALTER TABLE Y READ ONLY; 

synchronisieren Dann Y und Y_TEMP:

INSERT INTO Y_TEMP SELECT Y.A FROM Y; 
COMMIT; 

dann die Swap machen :

ALTER TABLE Y RENAME TO Y_OLD; 
ALTER TABLE Y_TEMP RENAME TO Y; 
DROP TABLE Y_OLD; 
ALTER TABLE Y RENAME CONSTRAINT y_temp_x_fk TO y_x_fk; 

Und bringen Sie Dinge sichern für WRITE

ALTER TABLE X READ WRITE; 

es Dann testen:

INSERT INTO X VALUES (1); 
INSERT INTO Y VALUES (1); 

SELECT * FROM Y; 

A 
1 

DELETE FROM X; 

1 row deleted. 

Und die Kaskade:

SELECT * FROM Y; 

no rows selected 
Verwandte Themen