Geralmente, desconfio de exclusões em cascata (e outras ações automáticas que podem soltar / danificar dados), seja por gatilhos ou por ON <something> CASCADE
. Tais instalações são muito poderosas, mas também potencialmente perigosas.
- Então, excluir em cascata é uma escolha correta aqui?
Certamente faria o que você está procurando: remover registros relacionados quando um registro pai for removido, sem a necessidade de implementar outra lógica para garantir que os filhos sejam removidos primeiro, tornando seu código mais conciso. Todas as ações serão agrupadas em uma transação implícita; portanto, se algo bloquear o filho, a operação inteira será bloqueada, mantendo a integridade referencial com pouco ou nenhum esforço extra de codificação.
Verifique se o uso de exclusões em cascata e outras ações "nos bastidores" estão bem documentadas, para que futuros mantenedores do sistema estejam totalmente cientes disso.
- Quando o detele em cascata não deve ser usado?
Não deve ser usado se você é paranóico como eu! Um ponto importante a considerar são os outros desenvolvedores que atualmente, ou no futuro, trabalham no seu código / banco de dados (daí o comentário acima sobre a documentação de comportamentos "ocultos").
Na minha experiência, é bastante comum as pessoas inexperientes usarem DELETE
novamente a INSERT
fim de atualizar linhas, especialmente quando o que elas realmente querem é uma operação MERGE
/ UPSERT
(atualize as linhas existentes e crie novas onde uma linha com uma determinada chave não existe) e o DBMS não oferece suporte à mesclagem / upsert (ou eles desconhecem seu suporte). Sem ações em cascata, isso é perfeitamente seguro (ou ocorrerá um erro quando ameaça a integridade dos dados), mas se alguém fizer isso para linhas em uma tabela pai em que os FKs de referência tenhamON DELETE CASCADE
definir então os dados relacionados serão excluídos como resultado da exclusão inicial e não serão substituídos - para que os dados sejam perdidos (mesmo que a exclusão e a inserção subsequente sejam agrupadas em transações explícitas, a cascata ocorrerá com a operação de exclusão - ela não será aguarde para ver se a transação substitui linhas na tabela pai nas instruções subseqüentes) e a cascata pode continuar por outros navios de relacionamento (por exemplo: excluir um supervisor sênior, sua equipe ser excluída por cascata, as equipes de suas equipes serão excluídas por cascata, todos os registros rastreados para todas essas pessoas são excluídos em cascata, ...). Sem a cascata ativada, você apenas obteria um erro aqui, em vez de os dados serem perdidos silenciosamente.