2010-09-13 7 views
9

Ich mache eine Massenmigration einer großen Oracle-Datenbank. Der erste Schritt besteht darin, eine ganze Ladung von Tabellen umzubenennen, um sie später wieder fallen zu lassen (aber ich muss die Daten für den Moment aufbewahren). Alle Fremdschlüsseleinschränkungen müssen gelöscht werden - sie sollten überhaupt nicht mit dem Rest der Datenbank verbunden sein. Wenn ich sie jetzt fallen lassen würde, könnte ich CASCADE CONSTRAINTS, aber umbenennen ändert einfach die Einschränkungen.Oracle - Tabellenbeschränkungen fallen lassen, ohne Tabellen zu löschen

Gibt es eine Möglichkeit, alle Einschränkungen, die CASCADE CONSTRAINTS fallen lassen würde fallen zu lassen, ohne die Tabelle selbst fallen zu lassen?

Antwort

18

Sie können es mit dynamischen SQL tun und Data Dictionary:

begin 
    for r in (select table_name, constraint_name 
       from user_constraints 
       where constraint_type = 'R') 
    loop 
     execute immediate 'alter table '||r.table_name 
          ||' drop constraint '||r.constraint_name; 
    end loop; 
end loop; 

Wenn die Tabellen von mehr als einem Benutzer gehören, werden Sie von DBA_CONSTRAINTS fahren müssen und umfassen BESITZER in der Projektion und der ausgeführten Erklärung. Wenn Sie weniger als alle Tabellen berühren möchten, müssen Sie die Liste in der WHERE-Klausel angeben, es sei denn, es gibt ein Muster für ihre Namen.

+0

Das sieht gut aus. Ich habe einige Einschränkungen hinzugefügt, um zu reflektieren, welche Tabellen ich modifizieren und damit weggehen möchte. Vielen Dank! – Submonoid

0

Sie können Constraints deaktivieren/erneut aktivieren, ohne sie zu löschen. Werfen Sie einen Blick auf this article.

+0

Stimmt, aber das hilft mir nicht wirklich. Ich könnte die einzelnen Constraints umgehen/deaktivieren, aber es ist eine große Datenbank und ich möchte nicht alle Constraints finden, die auf die Tabellen verweisen, die ich verschiebe. Ich möchte in der Lage sein, alle Beschränkungen auf die gleiche Weise automatisch zu löschen, wenn ich "DROP TABLE foo CASCADE CONSTRAINTS" verwenden könnte. – Submonoid