سؤال

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

ALTER TRIGGER TriggerName
ON MyTable
FOR INSERT, UPDATE
AS
BEGIN 
    If exist (select [Name] From MyTable WHERE IsDeleted = 0 AND [Name] in (SELECT [Name] FROM INSERTED)
    BEGIN
    RAISERROR ('ERROR Description', 16, 1);
    Rollback;
    END  
END
هل كانت مفيدة؟

المحلول

ليمتد بعد تغيير البيانات، بدلا من ما أعتقد أنك بعد.

وتحرير: وكما ذكر من قبل الآخرين، ويدير بدلا من بدلا من البيانات التي تتغير، لذلك تحتاج إلى إدراج البيانات إذا كان صحيحا، بدلا من وقف إدراج إذا كان غير صالح

.

واقرأ هذا السؤال للحصول على شرح أكثر تفصيلا لأنواع المشغلات.

SQL خادم "بعد INSERT" الزناد لا يرى إدراجها فقط في الصف

نصائح أخرى

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

وMSSQL لم يكن لديك قبل الزناد.

بالنسبة لـ SQL Server، يتم تشغيل FOR بعد SQL الذي قام بتشغيله.

من:http://msdn.microsoft.com/en-us/library/ms189799.aspx

ل | بعد

بعد يحدد أن يتم إطلاق مشغل DML فقط عندما تنفذ جميع العمليات المحددة في بيان SQL المفعول بنجاح.يجب أن تنجح جميع إجراءات التتالي المرجعية والتحقق من القيود أيضًا قبل حرائق الزناد هذه.

بعد هو الافتراضي عندما تكون الكلمة الرئيسية الوحيدة المحددة.

بعد لا يمكن تعريف المشغلات على وجهات النظر.

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

في SQL Server 2008 أو عليك أن تكون قادرة على تقديم جزئي فريد مؤشر شيئا من هذا القبيل:

create unique index IX on MyTable(name) where isDeleted = 0;

ومع ذلك، يمكنك تحقيق ذلك مع المزيد من العمل في SQL Server 2005. هو خدعة لجعل وجهة نظر يظهر سوى الصفوف التي لا يتم حذف، ومن ثم إنشاء فهرس متفاوت المسافات فريد على ما يلي:

 create view MyTableNotDeleted_vw
 with schema_binding /* Must be schema bound to create an indexed view */
 as
 select name 
 from dbo.MyTable /* Have to use dbo. for schema bound views */
 where isDeleted = 0;

 GO

 create unique clustered index IX on MyTableNotDeleted_vw ( name );

وهذا سيخلق فعال قيد فريد تؤثر فقط الصفوف التي لم يتم حذفها، وربما أداء أفضل من مشغل العرف!

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