2010-09-13 10 views
9

Sto eseguendo alcune migrazioni di massa di un grande database Oracle. Il primo passo consiste nel rinominare un intero carico di tabelle come preparazione per eliminarle in un secondo momento (ma per il momento devo tenere i dati al loro interno). Eventuali vincoli di chiave esterna su di essi devono essere abbandonati - non dovrebbero essere collegati al resto del database. Se li stessi rilasciando ora potrei VINCARE CASCADE, ma rinominare semplicemente altera i vincoli.Oracle: limitazioni della tabella di rilascio senza perdere tabelle

Esiste un modo per eliminare tutti i vincoli che i VINCOLI IN CASCATA potrebbero cadere senza rilasciare il tavolo stesso?

risposta

18

È possibile farlo con SQL dinamico e il dizionario dei dati:

begin 
    for r in (select table_name, constraint_name 
       from user_constraints 
       where constraint_type = 'R') 
    loop 
     execute immediate 'alter table '||r.table_name 
          ||' drop constraint '||r.constraint_name; 
    end loop; 
end loop; 

Se le tabelle sono di proprietà di più di un utente sarà necessario guidare da DBA_CONSTRAINTS e comprendono PROPRIETARIO nella proiezione e l'esecuzione dichiarazione. Se si desidera toccare meno di tutte le tabelle, temo che sarà necessario specificare l'elenco nella clausola WHERE, a meno che non vi sia qualche motivo per i loro nomi.

+0

Sembra buono. Ho aggiunto un paio di restrizioni per riflettere su quali tabelle voglio modificare e se ne sono andati. Grazie! – Submonoid

0

È possibile disabilitare/riattivare i vincoli senza rilasciarli. Dai un'occhiata a this article.

+0

Vero, ma questo non mi aiuta davvero. Potrei andare in giro a rilasciare/disabilitare i singoli vincoli, ma è un grande database e non voglio andare a cercare tutti i vincoli che fanno riferimento alle tabelle che sto spostando. Voglio essere in grado di eliminare automaticamente tutti i vincoli nello stesso modo in cui potrei se usassi 'DROP TABLE foo CASCADE CONSTRAINTS'. – Submonoid

Problemi correlati