カスケード削除を実行するネストされた SQL Server トランザクション
-
09-06-2019 - |
質問
Companies という名前のテーブルがあり、DepartmentID 列があるとします。EmployeeID 列を持つ Departaments テーブルもあります。もちろん、Employee テーブルもあります。問題は、会社を削除したいので、まずすべての部門のすべての従業員を削除し、次に会社のすべての部門を削除する必要があることです。カスケード削除はオプションではないため、ネストされたトランザクションを使用したいと考えています。SQLは初めてなので、助けていただければ幸いです。
解決
なぜここでネストされたトランザクションが必要なのかわかりません。実際に必要なトランザクションは 1 つだけです。
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 に注意してください。これはタイプミスではなく、DELETE で JOIN を実行するための正しい SQL 構文です。
各ステートメントはアトミックであり、DELETE 全体が成功するか失敗しますが、バッチ全体が成功するか失敗するため、この場合はそれほど重要ではありません。
ところで、あなたは人間関係を逆向きにしていたと思います。部門は EmployeeID を持たず、Employee はDepartmentID を持ちます。
他のヒント
あなたの質問には答えていませんが、外部キーについて は 当然のことですが、なぜそれが選択肢にないのでしょうか?
ネストされたトランザクションについては、次のとおりです。
BEGIN
delete from Employee where departmentId = 1;
BEGIN
delete from Department where companyId = 2;
BEGIN
delete from Company where companyId = 2;
END
END
END
もちろんプログラム的には異なって見えますが、それは使用しているプラットフォームによって異なります
所属していません StackOverflow