2012-02-14 8 views
10

Ho bisogno di rinominare una tabella in Oracle ma voglio essere sicuro che tutte le chiavi esterne, i vincoli, i trigger e le sequenze che fanno riferimento alla tabella vengano aggiornati per usare il nuovo nome.Come rinominare una tabella in Oracle in modo che tutte le chiavi esterne, i vincoli, i trigger e le sequenze vengano aggiornati e tutti i dati esistenti vengano conservati?

Come posso essere sicuro di non aver rotto nulla?

Si noti che voglio conservare tutti i dati esistenti contenuti nella tabella.

risposta

12

Dipende da cosa intendi per "eventuali chiavi esterne, vincoli, trigger e sequenze che fanno riferimento alla tabella vengono aggiornate per utilizzare il nuovo nome".

Eventuali indici, vincoli e trigger esistenti rispetto alla tabella che viene rinominata fanno automaticamente riferimento al nuovo nome.

Tuttavia, le convenzioni di denominazione utilizzate per tali oggetti non utilizzeranno automaticamente il nome aggiornato. Ad esempio, se la chiave primaria per TABLE_NAME viene in genere denominata TABLE_NAME_PK, la ridenominazione di TABLE_NAME in NEW_TABLE_NAME non ridenomina automaticamente il vincolo della chiave primaria a NEW_TABLE_NAME_PK.

Ciò che deve essere controllato è il codice: pacchetti, procedure e funzioni, che fa riferimento al vecchio nome della tabella, nonché a tutti i trigger che fanno riferimento al nome della tabella precedente. Analogamente, anche le visualizzazioni rispetto al vecchio nome della tabella si interromperanno. La vista ALL_DEPENDENCIES può aiutare a identificare quali di questi oggetti devono essere aggiornati.

+0

Grazie Adam. @Justin ha suggerito che i trigger continueranno a funzionare correttamente. Stai dicendo che dovrò correggere manualmente i trigger? Ad esempio, se avessi un trigger autoincrement (CREATE TRIGGER trg_bi_foo PRIMA DI INSERIRE SU foo FOR EACH ROW INIZIA SELEZIONA seq_foo.NEXTVAL INTO: NEW.foo_id FROM DUAL; END;) il "BEFORE INSERT ON foo" dovrebbe essere aggiornato automaticamente su "PRIMA" INSERIRE sulla barra "? –

+3

Sì.Ma se si ha qualche altro trigger su qualche altra tabella che esegue una query con 'foo', quel trigger non verrà automaticamente aggiornato per interrogare su' bar'. –

18

Se voi

ALTER TABLE old_table_name 
RENAME TO new_table_name; 

tutti i vincoli esistenti (chiave estera e di altri vincoli) e trigger sarà riferimento all'oggetto appena rinominato. Le sequenze non hanno alcuna relazione con le tabelle, quindi non ci sarà alcun impatto sulle sequenze (anche se se si intende che si fa riferimento alla sequenza in un trigger sulla tabella, il trigger continuerà a fare riferimento alla stessa sequenza dopo la rinomina). Tutte le stored procedure che hai scritto che fanno riferimento al vecchio nome della tabella, tuttavia, dovranno essere aggiornate per fare riferimento al nuovo nome della tabella.

Ora, mentre i vincoli e i trigger continueranno a funzionare correttamente, manterranno i loro nomi originali. Se si hanno convenzioni di denominazione per questi oggetti che si desidera mantenere dopo il nome della tabella, è necessario fare di più. Ad esempio, se si desidera un livello di riga prima di trigger di inserimento sul tavolo FOO di essere nominato TRG_BI_FOO e si rinomina il tavolo per BAR, avresti bisogno di modificare il grilletto in modo esplicito di cambiare il suo nome

ALTER TRIGGER trg_bi_foo 
    RENAME TO trg_bi_bar; 

Allo stesso modo, avresti bisogno di rinominare i vincoli e gli indici

ALTER TABLE bar 
    RENAME CONSTRAINT pk_foo TO pk_bar; 
1
ALTER TABLE oldName RENAME TO newName 

conserverà le dipendenze ed i dati della tabella, ma ci può sempre essere un pezzo di PL/SQL che fa riferimento al vecchio nome che sta per diventare valido.

Problemi correlati