Pergunta

Eu tenho realmente um grande banco de dados (em execução no PostgreSQL) contendo uma série de tabelas com relações sofisticadas entre eles (chaves estrangeiras, em cascata de exclusão e assim por diante). Eu preciso remover alguns dados de um número de mesas, mas eu não tenho certeza do que quantidade de dados será realmente excluído do banco de dados devido a remoções em cascata.

Como posso verificar que eu vou dados não exclui que não deve ser eliminada?

Eu tenho um banco de dados de teste - apenas uma cópia de um real, onde eu posso fazer o que eu quero:)

A única ideia que tenho é banco de dados de despejo antes e depois e verificá-lo. Mas não parece confortável. Outra idéia - parte despejo de banco de dados, que, como eu penso, não deve ser afetada por minhas instruções DELETE e verifique esta parte antes e após a remoção de dados. Mas não vejo maneiras simples de fazê-lo (há centenas de mesas e remoção deve trabalhar com ~ 10 deles). Existe alguma maneira de fazê-lo?

Quaisquer outras ideias de como resolver o problema?

Foi útil?

Solução

Você pode consultar o information_schema desenhar-se uma imagem de como as restrições são definidas no banco de dados. Então você vai saber o que vai acontecer quando você excluir. Isso será útil não só para este caso, mas sempre.

Algo como (para restrições)

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

Outras dicas

Usando psql, iniciar uma transação, executar suas exclusões, em seguida, executar o que quer verificando perguntas que você pode pensar. Você pode então rollback ou cometer.

Se a preocupação é chaves deixou pendurado (i .: apontando para um registro excluído), em seguida, executar a eliminação em seu banco de dados de teste, em seguida, usar consultas para encontrar as chaves que agora apontam para destinos inválidos. (Enquanto você está fazendo isso, você também pode ter certeza que a parte que devem ser afetados não fez mudança)

Uma solução melhor seria passar mapeamento tempo as cascatas de exclusão para que você saiba o que esperar -. Saber como seu banco de dados funciona é muito valiosa para que o esforço gasto em este será útil para além desta exclusão específica

E não importa como se você está de volta o DB antes de fazer grandes mudanças!

Obrigado por respostas!

Vinko, a sua resposta é muito útil para mim e eu vou estudá-la concha.

Na verdade, para o meu caso, foi o suficiente para comparar tabelas contagem antes e depois de registros de eliminação e verificar quais tabelas foram afetados por ela.

foi feito por comandos simples descrito abaixo

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top