Det är bättre att undvika att skriva ut tillfälliga spoolfiler. Använd ett PL/SQL-block. Du kan köra detta från SQL*Plus eller lägga in den här saken i ett paket eller en procedur. Anslutningen till USER_TABLES är till för att undvika visningsbegränsningar.
Det är osannolikt att du verkligen vill inaktivera alla begränsningar (inklusive INTE NULL, primärnycklar, etc). Du bör tänka på att sätta constraint_type i WHERE-satsen.
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;
/
Att aktivera begränsningarna igen är lite knepigt - du måste aktivera primärnyckelbegränsningar innan du kan referera till dem i en främmande nyckel begränsning. Detta kan göras med en ORDER BY på constraint_type. 'P' =primärnyckel, 'R' =främmande nyckel.
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;
/