Вложенная транзакция SQL Server, выполняющая каскадное удаление

StackOverflow https://stackoverflow.com/questions/58916

Вопрос

Предположим, у меня есть таблица «Компании», в которой есть столбец «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

Программно, конечно, это выглядит по-другому, но это будет зависеть от платформы, которую вы используете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top