Het is beter om het wegschrijven van tijdelijke spoolbestanden te vermijden. Gebruik een PL/SQL-blok. U kunt dit uitvoeren vanuit SQL*Plus of dit in een pakket of procedure plaatsen. De verbinding met USER_TABLES is er om weergavebeperkingen te vermijden.
Het is onwaarschijnlijk dat u echt alle beperkingen wilt uitschakelen (inclusief NOT NULL, primaire sleutels, enz.). Je zou moeten nadenken over het plaatsen van constraint_type in de WHERE-component.
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;
/
Het opnieuw inschakelen van de beperkingen is een beetje lastiger - u moet primaire sleutelbeperkingen inschakelen voordat u ernaar kunt verwijzen in een externe sleutelbeperking. Dit kan worden gedaan met behulp van een ORDER BY op constraint_type. 'P' =primaire sleutel, 'R' =externe sleutel.
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;
/