Domanda

Ho alcune (5) istruzioni di ridenominazione in uno script plsql

drop table new;
rename old to new;

le "vecchie" tabelle contengono informazioni molto preziose.

Per come la vedo io, se è garantito che il comando rename sia atomico, allora avrei risolto un problema.

È atomico?In caso contrario, esiste un modo per eseguire una ridenominazione "sicura"?

grazie in anticipo

È stato utile?

Soluzione

RENAME è un comando DDL. Quindi si tratta di una singola transazione discreta, se è questo che si intende per atomico in questo contesto. Di conseguenza si tratta di sicuro come qualsiasi cosa potrebbe essere. Non riesco a immaginare come una ridenominazione potrebbe causare la perdita di dati. Ma se ti senti paranoico, bisogna ricordare che per questo la natura ci ha dato di backup e ripristino.

modifica

Il modo per essere sicuri di non perdere dati se il DROP ha successo e il RENAME non è quello di distribuire due volte RENAME:

SQL>  rename old_table to something_else;
SQL>  rename new_table to old_table;
SQL>  drop table something_else;

In questo modo si hanno i dati online. Questo riduce al minimo anche il tempo di inattività.

Altri suggerimenti

Dato i tuoi commenti "Its un processo quotidiano" e "Sì, io sono preoccupato per il lapsus tra la caduta e rinominare le dichiarazioni"

Quanti soldi avete (o più precisamente, si ha la possibilità di partizionamento)? Se è così guardare scambio partizione

Hai il tuo tavolo permanente costituito da una singola partizione. Alla fine della giornata si scambia quella partizione con la tabella (come una singola istruzione atomica). Evitando di cadere / rinominare il tavolo principale, non si dovrebbe invalidare tutti i pacchetti, ecc (anche se questo può dipendere la versione DB).

In mancanza che utilizzano una vista e fare un CREATE OR REPLACE VIEW principale AS SELECT * FROM table_a e ogni sera si sostituisce la vista con uno nuovo sul tavolo diverso. Che probabilmente invaliderebbe pacchetti però.

Rename sarà atomica, così si dovrebbe andare bene. Come APC ha notato,

  

Non riesco a immaginare come una ridenominazione potrebbe causare la perdita di dati.

L'unica cosa che posso vedere nello script sarebbe il momento dopo il calo e prima la ridenominazione, non c'è un tavolo new, quindi potenzialmente un po 'di SQL potrebbe non riuscire. Tuttavia, che il tempo sarà piuttosto breve e qualcosa di più complicato (come un Insert From Select) sarebbe ancora più problematico.

Immagino che tu sia preoccupato che il DML simultaneo (inserimenti/aggiornamenti/eliminazioni) sulla vecchia tabella possa essere perso durante la ridenominazione?In tal caso, non preoccuparti: RENAME è DDL e blocca la tabella per tutta la durata.

Se sei preoccupato per il tempo che intercorre tra il rilascio e la ridenominazione, ecco un'altra idea:Utilizzare una vista che punti alla "tabella sottostante corretta".

Inizieresti con

CREATE VIEW someName as Select * From OldTable;

Quindi puoi impostare il tuo newTable.Quando sei pronto, allora basta

CREATE OR REPLACE View someName as Select * From NewTable;

Quindi puoi eliminare il tuo OldTable.La prossima volta che ottieni nuovi dati, crea un'altra NewTable_2 (o riutilizza OldTable ..allora probabilmente è meglio usare Table1 e Table2) e ridefinire nuovamente la vista.

La vista è semplicissima, quindi dovrebbe essere aggiornabile senza problemi.L'unica cosa complicata è creare sempre una nuova tabella (o alternare tra due tabelle), ma questo non dovrebbe essere troppo difficile da impostare e probabilmente più semplice che evitare totalmente eventuali problemi che potrebbero verificarsi con il suggerimento originale.

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