سؤال

سؤال عام جيد فيما يتعلق بمشغلات في SQL Server 2005.

في أي المواقف هي مشغلات الجدول التي أطلقت وأي حالات أليس كذلك؟

أي أمثلة شفرة لإظهار سيكون رائعا.

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

مثال على ما أعنيه،

UPDATE MyTable SET name = 'test rows' WHERE id in (1, 2, 3);

يحرر العبارة التالية فقط تشغيل التحديث مرة واحدة.

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

المحلول

متى تريدهم النار؟

CREATE TRIGGER AFTER ACTION

التي تعمل بعد العمل (insert update delete) الالتزام. INSTEAD OF حريق الزناد بدلا من العمل.

واحدة من أكبر gotchas مع المشغلات هي أنهم يطلقون النار كلما تم تنفيذ إجراء، حتى لو لم تتأثر عدد الصفوف. وبعد هذا ليس خطأ، وهو شيء يمكن أن يحرقك بسرعة كبيرة إذا لم تكن حذرا.

أيضا، مع المشغلات، سوف تستخدم inserted و deleted الجداول. يتم سرد الصفوف المحدثة في كليهما. هذا يلقي الكثير من الناس قبالة، لأنهم لا يستخدمون في التفكير في update ك delete ومن بعد insert.

وثائق MSDN لديها بالفعل مناقشة متعمقة جدا حول عندما يؤدي إلى إطلاق النار وما تأثيرها هنا.

نصائح أخرى

في عام 2008، يمكنك استخدام مدمج تغيير التقاط البيانات

هناك أيضا حالات قليلة تماما عندما لا تطلق المشغلات، مثل:

· يتم إسقاط جدول.

يتم اقتطاع الجدول.

· الإعدادات للمحفزات المتداخلة و / أو العودية تمنع الزناد من إطلاق النار.

البيانات بالجملة المحملة، تجاوز المشغلات.

يحرر العبارة التالية فقط تشغيل التحديث مرة واحدة.

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

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

إدراج بالجملة عن طريق تمرير الممرات إلا إذا حددت لاستخدامها. أن تكون على دراية بهذا لأنه إذا سمحت لهم بتمرير الزناد، فستحتاج إلى رمز للتأكد من ما يحدث في الزيادة يحدث أيضا بعد إدراج السائبة. أو تحتاج إلى استدعاء إدراج السائبة مع خيار Fire_Triggers.

اعتقدت أنني سأصلى من الرابط نشر إريك موقفا لن يطلق فيه الزناد:

على الرغم من أن عبارة جدول Truncate ساري المفعول حذف، إلا أنه لا يمكن تنشيط الزناد لأن العملية لا تقوم بتسجيل حذف الصفات الفردية. ومع ذلك، فإن أولئك الذين لديهم أذونات على جدول لتنفيذ جدول اقتطاع يحتاجون إلى قلقهم بشأن التحايل عن غير قصد من حذف الزناد مع عبارة جدول اقتطاع.

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