Jak mogę wyłączyć wszystkie ograniczenia tabeli w Oracle za pomocą jednego polecenia? Może to dotyczyć pojedynczej tabeli, listy tabel lub wszystkich tabel.
96
Lepiej unikać wypisywania tymczasowych plików buforowania. Użyj bloku PL / SQL. Możesz to uruchomić z SQL * Plus lub umieścić to w pakiecie lub procedurze. Łączenie do USER_TABLES ma na celu uniknięcie ograniczeń widoku.
Jest mało prawdopodobne, że naprawdę chcesz wyłączyć wszystkie ograniczenia (w tym NOT NULL, klucze podstawowe itp.). Powinieneś pomyśleć o umieszczeniu constraint_type w klauzuli WHERE.
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;
/
Ponowne włączenie ograniczeń jest nieco trudniejsze - musisz włączyć ograniczenia klucza podstawowego, zanim będziesz mógł odwoływać się do nich w ograniczeniu klucza obcego. Można to zrobić za pomocą ORDER BY na constraint_type. „P” = klucz podstawowy, „R” = klucz obcy.
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')
do pierwszego segmentu kodu.Aby policzyć zależności między ograniczeniami:
źródło
To nie jest pojedyncze polecenie, ale oto jak to robię. Poniższy skrypt został zaprojektowany do działania w SQL * Plus. Uwaga, celowo napisałem to, aby działało tylko w ramach bieżącego schematu.
Aby ograniczyć to, co upuszczasz, filtruj dodaj klauzulę where do instrukcji select: -
Aby działać na więcej niż bieżącym schemacie, zmodyfikuj instrukcję select, aby wybierać spośród all_constraints zamiast user_constraints.
Uwaga - z jakiegoś powodu nie mogę sprawić, aby podkreślenie NIE działało jak kursywa w poprzednim akapicie. Jeśli ktoś wie, jak to naprawić, prosimy o edycję tej odpowiedzi.
źródło
Użyj następującego kursora, aby wyłączyć wszystkie ograniczenia .. I zmień zapytanie dla włączania ograniczeń ...
źródło
Można to napisać w języku PL / SQL po prostu w oparciu o widok systemu DBA / ALL / USER_CONSTRAINTS, ale różne szczegóły nie są tak banalne, jak się wydaje. Musisz uważać na kolejność, w jakiej to się robi, a także wziąć pod uwagę obecność unikalnych indeksów.
Kolejność jest ważna, ponieważ nie można usunąć unikalnego lub podstawowego klucza, do którego odwołuje się klucz obcy, a w tabelach w innych schematach mogą znajdować się klucze obce, które odwołują się do kluczy podstawowych w twoim własnym, więc chyba że masz uprawnienie ALTER ANY TABLE nie może porzucić tych PK i UK. Nie można również zmienić indeksu unikatowego na indeks nieunikalny, więc musisz go porzucić, aby usunąć ograniczenie (z tego powodu prawie zawsze lepiej jest implementować unikalne ograniczenia jako „rzeczywiste” ograniczenie, które jest obsługiwane przez nie unikalny indeks).
źródło
Nie wygląda na to, że możesz to zrobić za pomocą jednego polecenia, ale oto najbliższa rzecz, jaką udało mi się znaleźć.
źródło
To kolejny sposób wyłączania ograniczeń (pochodzi z https://asktom.oracle.com/pls/asktom/f?p=100:11:2402577774283132::::P11_QUESTION_ID:399218963817 )
działa jak marzenie
źródło
W skrypcie „disable” kolejność klauzuli powinna wyglądać tak:
Celem tej klauzuli jest wyłączenie ograniczeń we właściwej kolejności.
źródło
Ta instrukcja zwraca polecenia, które wyłączają wszystkie ograniczenia, w tym klucz podstawowy, klucze obce i inne ograniczenia.
źródło
z kursorem dla pętli (użytkownik = 'TRANEE', tabela = 'D')
(Jeśli zmienisz opcję wyłącz na włączenie, możesz włączyć wszystkie ograniczenia)
źródło
Możesz wykonać wszystkie polecenia zwrócone przez następujące zapytanie:
select 'ALTER TABLE' || substr (c.nazwa_tabeli, 1,35) || 'DISABLE CONSTRAINT' || constraint_name || ' ; ' from user_constraints c --where c.table_name = 'TABLE_NAME';
źródło