Aninhado de transação do SQL Server realização de exclusão em cascata
-
09-06-2019 - |
Pergunta
Suponha que eu tenha uma tabela chamada Empresas que tem um DepartmentID coluna.Há também um Departaments tabela que tem como Códigodofuncionário coluna.Claro que eu tenho uma tabela de Empregados bem.O problema é que eu queira excluir uma empresa, então, primeiro eu tenho que eliminar todos os empregados de cada departamento e, em seguida, todos os departaments na empresa.Exclusão em cascata não é uma opção, portanto, eu gostaria de usar transações aninhadas.Eu sou novo para o SQL então, eu gostaria de receber sua ajuda.
Solução
Eu não tenho certeza de por que você precisa de transações aninhadas aqui.Você só precisa de uma transação real:
BEGIN TRAN
DELETE FROM Employee
FROM Employee
INNER JOIN Department ON Employee.DepartmentID = Department.DepartmentID
INNER JOIN Company ON Department.CompanyID = Company.CompanyID
WHERE Company.CompanyID = @CompanyID
DELETE FROM Department
FROM Department
INNER JOIN Company ON Department.CompanyID = Company.CompanyID
WHERE Company.CompanyID = @CompanyID
DELETE FROM Company
WHERE Company.CompanyID = @CompanyID
COMMIT TRAN
Nota o casal, que não é um erro, é o correto a sintaxe SQL para executar uma ASSOCIAÇÃO em EXCLUIR.
Cada instrução atômica é, que toda a ELIMINAR será bem sucedida ou falhar, o que não é importante neste caso, pois todo o lote vai ter êxito ou falha.
BTW, eu acho que você tinha seus relacionamentos para trás.O Departamento não teria um Códigodofuncionário, o Trabalhador teria um DepartmentID.
Outras dicas
Eu não estou respondendo a sua pergunta, mas de Chaves estrangeiras. é o caminho a percorrer, por que não é uma opção?
Como para transações aninhadas são eles:
BEGIN
delete from Employee where departmentId = 1;
BEGIN
delete from Department where companyId = 2;
BEGIN
delete from Company where companyId = 2;
END
END
END
Programaticamente parece diferente, é claro, mas que dependem da plataforma que você está usando