sql >> Databasteknik >  >> RDS >> Oracle

Inaktivera alla tabellbegränsningar i Oracle

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;
/


  1. Får fel när paketet körs

  2. Oracle PL/SQL - samlingar (kapslade tabeller)

  3. Hur funktionen EXPORT_SET() fungerar i MySQL

  4. Hur man kombinerar resultaten av två frågor i SQL