Wie kann ich alle Tabelleneinschränkungen in Oracle mit einem einzigen Befehl deaktivieren? Dies kann entweder für eine einzelne Tabelle, eine Liste von Tabellen oder für alle Tabellen erfolgen.
Es ist besser zu vermeiden, temporäre Spooldateien zu schreiben. Verwenden Sie einen PL / SQL-Block. Sie können dies in SQL * Plus ausführen oder dieses Ding in ein Paket oder eine Prozedur einfügen. Der Join zu USER_TABLES dient dazu, Ansichtsbeschränkungen zu vermeiden.
Es ist unwahrscheinlich, dass Sie wirklich alle Einschränkungen deaktivieren möchten (einschließlich NOT NULL, Primärschlüssel usw.). Sie sollten darüber nachdenken, Constraint_Type in die WHERE-Klausel aufzunehmen.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'ENABLED'
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
ORDER BY c.constraint_type DESC)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
END LOOP;
END;
/
Das erneute Aktivieren der Einschränkungen ist etwas schwierig. Sie müssen die Primärschlüsseleinschränkungen aktivieren, bevor Sie sie in einer Fremdschlüsseleinschränkung referenzieren können. Dies kann mit einem ORDER BY für Constraint_Type erfolgen. 'P' = Primärschlüssel, 'R' = Fremdschlüssel.
BEGIN
FOR c IN
(SELECT c.owner, c.table_name, c.constraint_name
FROM user_constraints c, user_tables t
WHERE c.table_name = t.table_name
AND c.status = 'DISABLED'
ORDER BY c.constraint_type)
LOOP
dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
END LOOP;
END;
/
AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
dem ersten Codesegment hinzufügen .So berücksichtigen Sie die Abhängigkeiten zwischen den Einschränkungen:
quelle
Es ist kein einzelner Befehl, aber so mache ich es. Das folgende Skript wurde für die Ausführung in SQL * Plus entwickelt. Beachten Sie, dass ich dies absichtlich so geschrieben habe, dass es nur innerhalb des aktuellen Schemas funktioniert.
Um einzuschränken, was Sie löschen, fügen Sie der select-Anweisung eine where-Klausel hinzu: -
Um mehr als das aktuelle Schema auszuführen, ändern Sie die select-Anweisung so, dass sie aus all_constraints und nicht aus user_constraints ausgewählt wird.
Hinweis - Aus irgendeinem Grund kann ich den Unterstrich nicht dazu bringen, sich NICHT wie eine Kursivschrift im vorherigen Absatz zu verhalten. Wenn jemand weiß, wie man das Problem behebt, können Sie diese Antwort jederzeit bearbeiten.
quelle
Verwenden Sie den folgenden Cursor, um alle Einschränkungen zu deaktivieren. Ändern Sie die Abfrage, um Einschränkungen zu aktivieren.
quelle
Dies kann in PL / SQL ziemlich einfach basierend auf der Systemansicht DBA / ALL / USER_CONSTRAINTS geschrieben werden, aber verschiedene Details sind nicht so trivial, wie es sich anhört. Sie müssen vorsichtig mit der Reihenfolge sein, in der es durchgeführt wird, und Sie müssen auch das Vorhandensein eindeutiger Indizes berücksichtigen.
Die Reihenfolge ist wichtig, da Sie keinen eindeutigen oder Primärschlüssel löschen können, auf den von einem Fremdschlüssel verwiesen wird, und es möglicherweise Fremdschlüssel in Tabellen in anderen Schemas gibt, die auf Primärschlüssel in Ihren eigenen verweisen Diese PKs und UKs können nicht gelöscht werden. Sie können einen eindeutigen Index auch nicht in einen nicht eindeutigen Index umwandeln, sodass Sie ihn löschen müssen, um die Einschränkung zu löschen (aus diesem Grund ist es fast immer besser, eindeutige Einschränkungen als "echte" Einschränkung zu implementieren, die von einem Nicht-Index unterstützt wird -eindeutiger Index).
quelle
Es sieht nicht so aus, als könnten Sie dies mit einem einzigen Befehl tun, aber hier ist das Nächste, was ich finden könnte.
quelle
Dies ist eine weitere Möglichkeit zum Deaktivieren von Einschränkungen (von https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132::::P11_QUESTION_ID:399218963817 ).
klappt wunderbar
quelle
Im "disable" -Skript sollte die Reihenfolge nach Klausel lauten:
Das Ziel dieser Klausel ist es, die Einschränkungen in der richtigen Reihenfolge zu deaktivieren.
quelle
Diese Anweisung gibt die Befehle zurück, mit denen alle Einschränkungen deaktiviert werden, einschließlich Primärschlüssel, Fremdschlüssel und andere Einschränkungen.
quelle
mit Cursor für Schleife (user = 'TRANEE', table = 'D')
(Wenn Sie Deaktivieren in Aktivieren ändern, können Sie alle Einschränkungen aktivieren.)
quelle
Sie können alle von der folgenden Abfrage zurückgegebenen Befehle ausführen:
Wählen Sie 'ALTER TABLE' || substr (c.table_name, 1,35) || 'DISABLE CONSTRAINT' || Constraint_Name || ' ; ' from user_constraints c --where c.table_name = 'TABLE_NAME';
quelle