Eu preciso excluir muitas linhas de uma tabela pessoas, que é referenciada por muitas outras tabelas como FK.
Se eu tivesse DELETE CASCADE, poderia simplesmente deletar os registros das pessoas, e deletar automaticamente das outras tabelas, mas não gosto da ideia.
Eu gostaria de um script que recebesse como entrada uma instrução DELETE e gerasse todas as instruções DELETE necessárias. Idealmente, ele me diria quantos registros seriam excluídos.
Exemplo:
Entrada:
DELETE FROM persons WHERE person_id < 1000000
Resultado:
-- This would delete 124,345 records
DELETE FROM persons_addresses WHERE person_id < 1000000
-- This would delete 82,954 records
DELETE FROM persons_phone numbers WHERE person_id < 1000000
...
-- This would delete 999,999 records
DELETE FROM persons WHERE person_id < 1000000
Não conheço essa ferramenta, mas você pode facilmente criar uma por conta própria ( chaves estrangeiras em um banco de dados de servidor sql ):
lhe dará todos os filhos da tabela raiz. Você pode criar um CTE recursivo que calcula todos os descendentes dessa tabela.
Quanto ao número de linhas afetadas, você pode construí-lo como:
As informações necessárias para gerar as consultas e as contagens estão todas disponíveis nas visualizações do catálogo, como
sys.columns
esys.foreign_key_columns
. Precisamos encontrar todas as tabelas filhas e contar quantas linhas em cada tabela filha atendem aos mesmos critérios do ID pai.Exemplo de uso:
Minhas tabelas de amostra eram muito menores, mas minha saída ficou assim:
Limitações: