Вложенная транзакция SQL Server, выполняющая каскадное удаление
-
09-06-2019 - |
Вопрос
Предположим, у меня есть таблица «Компании», в которой есть столбец «DepartmentID».Также есть таблица «Отделы», в которой есть столбец «Идентификатор сотрудника».Конечно, у меня также есть таблица «Сотрудники».Проблема в том, что я хочу удалить компанию, поэтому сначала мне нужно удалить всех сотрудников каждого отдела, а затем все отделы компании.Каскадное удаление недоступно, поэтому я хочу использовать вложенные транзакции.Я новичок в SQL, поэтому буду признателен за вашу помощь.
Решение
Я не уверен, зачем вам здесь нужны вложенные транзакции.Вам нужна только одна фактическая транзакция:
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
Обратите внимание на двойной FROM, это не опечатка, это правильный синтаксис SQL для выполнения JOIN при DELETE.
Каждый оператор является атомарным: либо весь DELETE завершится успешно, либо завершится неудачей, что в данном случае не так важно, поскольку весь пакет либо будет успешным, либо потерпит неудачу.
Кстати, я думаю, что ваши отношения были наоборот.У отдела не будет идентификатора сотрудника, у сотрудника будет идентификатор отдела.
Другие советы
Я не отвечаю на ваш вопрос, но внешние ключи является путь, почему это не вариант?
Что касается вложенных транзакций, то это:
BEGIN
delete from Employee where departmentId = 1;
BEGIN
delete from Department where companyId = 2;
BEGIN
delete from Company where companyId = 2;
END
END
END
Программно, конечно, это выглядит по-другому, но это будет зависеть от платформы, которую вы используете.