Come posso verificare di aver rimosso solo i dati richiesti?
-
02-07-2019 - |
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?
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