Pregunta

Tengo una base de datos realmente grande (que se ejecuta en PostgreSQL) que contiene muchas tablas con relaciones sofisticadas entre ellas (claves externas, eliminación de cascadas, etc.). Necesito eliminar algunos datos de una serie de tablas, pero no estoy seguro de qué cantidad de datos se eliminará realmente de la base de datos debido a eliminaciones en cascada.

¿Cómo puedo comprobar que no eliminaré los datos que no se deben eliminar?

Tengo una base de datos de prueba, solo una copia de una real donde puedo hacer lo que quiero :)

La única idea que tengo es volcar la base de datos antes y después y verificarla. Pero no se ve cómodo. Otra idea: volcar parte de la base de datos, que, como creo, no debería verse afectada por mis sentencias DELETE y verificar esta parte antes y después de la eliminación de datos. Pero no veo formas sencillas de hacerlo (hay cientos de tablas y la eliminación debería funcionar con ~ 10 de ellas). ¿Hay alguna manera de hacerlo?

¿Alguna otra idea sobre cómo resolver el problema?

¿Fue útil?

Solución

Puede consultar el esquema de información para dibujar una imagen de cómo se definen las restricciones en la base de datos. Entonces sabrás lo que va a pasar cuando elimines. Esto será útil no solo para este caso, sino para siempre.

Algo como (por restricciones)

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

Otros consejos

Utilizando psql, inicie una transacción, realice sus eliminaciones y, a continuación, ejecute las consultas de verificación que pueda imaginar. A continuación, puede retroceder o cometer.

Si la preocupación es que las claves quedan colgando (es decir, señalando un registro eliminado), ejecute la eliminación en su base de datos de prueba, luego use las consultas para encontrar las claves que ahora apuntan a objetivos no válidos. (mientras haces esto, también puedes asegurarte de que la parte que no debería verse afectada no haya cambiado)

Una mejor solución sería dedicar tiempo a trazar las cascadas de eliminación para que sepa qué esperar: saber cómo funciona su base de datos es bastante valioso, por lo que el esfuerzo dedicado a esto será útil más allá de esta eliminación en particular.

¡Y no importa qué tan seguro esté haciendo una copia de seguridad de la base de datos antes de hacer grandes cambios!

¡Gracias por las respuestas!

Vinko, tu respuesta es muy útil para mí y la estudiaré.

en realidad, para mi caso, fue suficiente para comparar los conteos de tablas antes y después de la eliminación de registros y verificar qué tablas se vieron afectadas por él.

se realizó mediante comandos simples que se describen a continuación

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top