Domanda

Sto facendo alcune migrazioni di massa di un ampio database Oracle. Il primo passo di questo comporta rinomina un intero carico di tabelle come preparazione per cadere successivamente (ma necessario per mantenere i dati nel loro intorno per ora). Eventuali vincoli di chiave esterna su di loro hanno bisogno di essere caduto - non dovrebbero essere collegati al resto del database a tutti. Se li stavano cadendo ora potevo CASCADE VINCOLI, ma rinomina semplicemente altera i vincoli.

C'è un modo per eliminare tutti i vincoli che VINCOLI CASCADE cadrebbero senza far cadere la tabella stessa?

È stato utile?

Soluzione

E '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;

Se le tabelle sono di proprietà di più di un utente che si avrà bisogno di guidare da DBA_CONSTRAINTS e comprendono PROPRIETARIO nella proiezione e l'istruzione eseguita. Se si vuole toccare meno di tutte le tabelle ho paura è necessario specificare l'elenco nella clausola WHERE, a meno che non ci sia un modello per i loro nomi.

Altri suggerimenti

È possibile disattivare / riattivare i vincoli senza farli cadere. Date un'occhiata a questo articolo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top