Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Cascatear em Excluir ou usar gatilhos?


EXCLUSÃO DE CASCATA no MSSQL Server só pode cascatear para uma única tabela. Se você tiver duas tabelas com relacionamentos de chave estrangeira com uma tabela de dimensão, só poderá excluir em cascata para uma delas. (Isso é para evitar exclusões em cascata por vários caminhos e criar conflitos, assim como C++ permite herança múltipla, mas C# permite apenas herança única)

Quando esse for o caso, você será forçado a usar gatilhos ou lidar especificamente com o caso em seu código.

Por esse motivo tenho visto muitas pessoas optarem pelo uso de gatilhos em todos os casos. Mesmo quando há apenas uma mesa estrangeira. Isso garante consistência e assim as pessoas sabem o que procurar ao manter o banco de dados.

Se alguém pudesse cascatear uma exclusão para mais de uma tabela, eu diria que seria a opção mais preferível. Essa limitação, no entanto, turva as águas e atualmente sou mais a favor de gatilhos que possuam todos esses comportamentos. A sobrecarga no uso de gatilhos para exclusões e atualizações em cascata é apenas menor em termos de codificação, mas permite práticas padrão que são verdadeiramente genéricas.

EDITAR:

Você pode querer mover a 'resposta aceita' para outra pessoa, eu descobri que estava errado sobre o acima.

Você PODE ter várias tabelas de fatos com restrições de chave estrangeira ON DELETE CASCADE para uma tabela de dimensão de sinal.

O que você não pode fazer é ter uma tabela de fatos com restrições de chave estrangeira ON DELETE CASCADE para várias tabelas de dimensão.

Por exemplo...
- Tabela de dimensões [Person] (id INT IDENTITY, )
- Tabela de dimensões [Exam] (id INT IDENTITY, )
- Face Table [Exam_Score] (person_id INT, exam_id INT, pontuação INT)

Se a Pessoa ou o Exame forem excluídos, você deseja que o(s) registro(s) Exam_Score associado(s) também sejam excluídos.

Isso não é possível usando ON DELETE CASCADE no MS SQL Server, daí a necessidade de triggers.

(Desculpas a Mehrdad que tentou me explicar isso, mas eu perdi completamente o ponto dele.)