معاملة SQL Server المتداخلة التي تؤدي إلى الحذف المتتالي

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

سؤال

لنفترض أن لدي جدول يسمى الشركات الذي يحتوي على عمود معرف القسم.يوجد أيضًا جدول الأقسام الذي يحتوي على عمود معرف الموظف.بالطبع لدي جدول الموظفين أيضًا.المشكلة هي أنني أريد حذف شركة، لذا يجب أولاً حذف جميع الموظفين لكل قسم ثم جميع الأقسام في الشركة.لا يعد حذف 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

يبدو الأمر مختلفًا برمجيًا بالطبع، لكن ذلك يعتمد على النظام الأساسي الذي تستخدمه

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top