Вложенная транзакция SQL Server, выполняющая каскадное удаление - PullRequest
0 голосов
/ 12 сентября 2008

Предположим, у меня есть таблица "Компании", в которой есть столбец DepartmentID. Также есть таблица Departaments, в которой есть столбец EmployeeID. Конечно, у меня есть таблица сотрудников. Проблема в том, что я хочу удалить компанию, поэтому сначала мне нужно удалить всех сотрудников для каждого отдела, а затем все отделы в компании. Каскадное удаление не вариант, поэтому я хочу использовать вложенные транзакции. Я новичок в SQL, поэтому буду признателен за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 12 сентября 2008

Я не уверен, зачем вам здесь нужны вложенные транзакции. Вам нужна только одна фактическая транзакция:

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 будет успешным, либо неудачным, что в данном случае не так уж важно, потому что весь пакет будет либо успешным, либо неудачным.

Кстати, я думаю, что ваши отношения были задом наперед. У Департамента не будет идентификатора сотрудника, у сотрудника будет идентификатор отдела.

0 голосов
/ 12 сентября 2008

Я не отвечаю на ваш вопрос, но использование иностранных ключей - это , почему это не вариант?

Что касается вложенных транзакций, то они:

BEGIN
  delete from Employee where departmentId = 1;
  BEGIN
     delete from Department where companyId = 2;
     BEGIN
        delete from Company where companyId = 2;
     END
  END
END

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

...