Domanda

Ho un database davvero grande (in esecuzione su PostgreSQL) che contiene molte tabelle con relazioni sofisticate tra loro (chiavi esterne, su cascade di eliminazione e così via). Devo rimuovere alcuni dati da un numero di tabelle, ma non sono sicuro di quale quantità di dati verrà effettivamente eliminata dal database a causa delle rimozioni a cascata.

Come posso verificare che non eliminerò i dati che non devono essere eliminati?

Ho un database di test - solo una copia di quello reale in cui posso fare quello che voglio :)

L'unica idea che ho è di scaricare il database prima e dopo e controllarlo. Ma non sembra comodo. Un'altra idea: scaricare una parte del database, che, come penso, non dovrebbe essere influenzata dalle mie dichiarazioni DELETE e controllare questa parte prima e dopo la rimozione dei dati. Ma non vedo modi semplici per farlo (ci sono centinaia di tabelle e la rimozione dovrebbe funzionare con ~ 10 di esse). C'è un modo per farlo?

Altre idee su come risolvere il problema?

È stato utile?

Soluzione

È possibile eseguire una query su information_schema per disegnare un'immagine di come i vincoli sono definiti nel database. Quindi saprai cosa succederà quando elimini. Questo sarà utile non solo per questo caso, ma sempre.

Qualcosa di simile (per vincoli)

select table_catalog,table_schema,table_name,column_name,rc.* from
information_schema.constraint_column_usage ccu, 
information_schema.referential_constraints rc 
where ccu.constraint_name = rc.constraint_name

Altri suggerimenti

Usando psql, avvia una transazione, esegui le tue eliminazioni, quindi esegui qualsiasi query di controllo a cui riesci a pensare. È quindi possibile eseguire il rollback o il commit.

Se la preoccupazione è che le chiavi rimangano penzolanti (ad es. puntando a un record eliminato), esegui la cancellazione sul tuo database di test, quindi usa le query per trovare le chiavi che ora puntano a target non validi. (mentre lo fai, puoi anche assicurarti che la parte che non dovrebbe essere interessata non sia cambiata)

Una soluzione migliore sarebbe quella di impiegare del tempo a mappare le cascate di eliminazione in modo da sapere cosa aspettarsi: sapere come funziona il database è piuttosto prezioso, quindi lo sforzo speso per questo sarà utile oltre questa particolare cancellazione.

E non importa quanto tu sia sicuro di eseguire il backup del DB prima di fare grandi cambiamenti!

Grazie per le risposte!

Vinko, la tua risposta è molto utile per me e la studierò.

in realtà, nel mio caso, è stato sufficiente confrontare i conteggi delle tabelle prima e dopo l'eliminazione dei record e verificare quali tabelle ne sono state interessate.

è stato fatto con semplici comandi descritti di seguito

psql -U U_NAME -h`hostname` -c '\d' | awk '{print $3}' > tables.list

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts; done

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts2; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts2; done

diff tables.counts tables.counts2
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top