معاملة SQL Server المتداخلة التي تؤدي إلى الحذف المتتالي
-
09-06-2019 - |
سؤال
لنفترض أن لدي جدول يسمى الشركات الذي يحتوي على عمود معرف القسم.يوجد أيضًا جدول الأقسام الذي يحتوي على عمود معرف الموظف.بالطبع لدي جدول الموظفين أيضًا.المشكلة هي أنني أريد حذف شركة، لذا يجب أولاً حذف جميع الموظفين لكل قسم ثم جميع الأقسام في الشركة.لا يعد حذف Cascade خيارًا، لذلك أرغب في استخدام المعاملات المتداخلة.أنا جديد على 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.
كل عبارة ذرية، فإما أن تنجح عملية الحذف بأكملها أو تفشل، وهذا ليس مهمًا في هذه الحالة لأن الدفعة بأكملها إما ستنجح أو تفشل.
راجع للشغل – أعتقد أن علاقاتك كانت عكسية.لن يكون لدى القسم معرف الموظف، وسيكون لدى الموظف معرف القسم.
نصائح أخرى
أنا لا أجيب على سؤالك، ولكن المفاتيح الخارجية يكون الطريق للذهاب، لماذا ليس خيارا؟
أما المعاملات المتداخلة فهي:
BEGIN
delete from Employee where departmentId = 1;
BEGIN
delete from Department where companyId = 2;
BEGIN
delete from Company where companyId = 2;
END
END
END
يبدو الأمر مختلفًا برمجيًا بالطبع، لكن ذلك يعتمد على النظام الأساسي الذي تستخدمه