سؤال

لقد بنيت الزناد حيث أحاول أن نضع الأولويات في النظام وعدم السماح مكررة أولوية القيم.هناك بعض الأشياء في الاعتبار.

  1. يمكن للمستخدم مجانا تشكل أولوية.
  2. لا يوجد شيء لمنعهم من قطف نفس أولوية عنصر آخر.
  3. عندما تم إدخال قيمة تساوي قيمة أخرى حديثا الأولوية البند يجب أن تأخذ الأسبقية فى أولوية أخرى يجب أن تكون زيادة.

    CREATE TRIGGER dbo.trg_Priority
        ON  dbo.Stories
        AFTER INSERT,UPDATE,DELETE
    AS
    BEGIN
        SET NOCOUNT ON;
    
    -- Insert statements for trigger here
    DECLARE @StoryId INT
    DECLARE @OldLocation INT
    DECLARE @NewLocation INT
    
    SELECT @NewLocation = Priority, @StoryId = StoryId FROM INSERTED
    SELECT @OldLocation = Priority FROM DELETED
    
    IF @NewLocation = @OldLocation
        RETURN;
    
    IF @NewLocation IS NULL
    BEGIN
        UPDATE Stories SET
            Priority = Priority - 1
        WHERE Priority > @OldLocation
    END
    
    IF @NewLocation > @OldLocation
    BEGIN
        UPDATE Stories SET
            Priority = Priority + 1
        WHERE Priority >= @NewLocation
        AND StoryId <> @StoryId
    END
    
    IF @NewLocation < @OldLocation
    BEGIN
        UPDATE Stories SET
            Priority = Priority + 1
        WHERE Priority >= @NewLocation
        AND Priority < @OldLocation
        AND StoryId <> @StoryId
    END
    END
    GO
    

لم يتم اختبار هذا الزناد الكثير حتى إذا كان هناك مجالات الاهتمام تتردد في الكلام.ما أنا في النهاية أريد أن أعرف إذا كان ينبغي لي أن محاولة تحويل هذا إلى تحديث واحد مع بيان حالة.(إذا كان هذا ممكنا)

إذا كان سيكون أكثر performant لجعل هذا واحد UPDATE بيان أنا حقا يمكن استخدام اليد الاعتقاد بها!

هل كانت مفيدة؟

المحلول

تحتاج إلى كتابة على الزناد.فإنه يفترض واحدة فقط السجلات سوف يكون من أي وقت مضى إدراج/تحديث أو delted في atime.لا يمكنك كتابة الزناد مع هذا الافتراض, مشغلات تعمل على دفعات من البيانات غير الصف byrow.تحتاج إلى الانضمام إلى إدراج و حذف التحديثات الخاصة بك.لذا نعم, أنا أحاول أن أكتب التحديث مع بيان حالة.

ولماذا هذا حذف الزناد ؟ لن;t أن arecord لتحديث إذا كان حذفها.

نصائح أخرى

تأكد من التراجع ورفع خطأ (شدة 16) إذا @@ROWCOUNT > 1.المشغل الخاص بك حاليا مكتوبة من شأنه أن يسبب قدرا كبيرا من البيانات الفساد المستخدم محاولة إدراج أو تحديث أو حذف صفوف متعددة في وقت واحد.

وقال IronGoofy هو الحق:سوف تكون فقط لمس الطاولة مرة واحدة ، بغض النظر إذا كان الشرط.حتى كسر ذلك في عدة تصريحات يجعل رمز أسهل للقراءة/أكثر للصيانة.

إذا كنت تسمح صفوف متعددة ليتم تحديثه في وقت واحد, سوف تحتاج إلى تغيير هذا.منطق قد تكون شاقة!

كيف حول هذا:

 UPDATE Stories SET Priority = CASE 
     WHEN Priority > @OldLocation THEN Priority-1
     WHEN Priority >= @NewLocation AND StoryID <> @StoryID THEN Priority+1
     WHEN Priority >= @NewLocation AND @Priority < @OldLocation And StoryID <> StoryID THEN Priority +1
END
GO

لا ينبغي أن يكون هناك أي (ملحوظة) الفارق في الأداء, في أي حال سيتم إصدار تحديث واحد البيان إلى قاعدة البيانات.

قررت التخلي عن هذه الفكرة, و أترك واجهة المستخدم تحديث الأولوية.لقد توقفت عن السماح إدخال المستخدم.

أنا لست متأكدا من أي من هذه الإجابات صحيحة, لذلك أنا ذاهب للاحتفال بهذا النحو الصحيح والسماح للمجتمع معرفة ذلك مع التجربة والخطأ.:)

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