RAISERROR bilan t-SQLda ma'lum bir xatoni ko'taring

INSTEAD OF INSERT INSERT tetikleyicisi (SQL Server 2005) mavjud bo'lgan ko'rinishga ega. Foydalanuvchiga versiya qo'shilsa, ular aslida bir nechta jadvalga qo'shimchalar va yangilanishlar qilishadi. Ko'rinish, indeksga ega bo'lmasligi uchun etarli darajada murakkabdir, shuning uchun afsuski cheklanmagan.

Ko'rinish C# -dan kodni o'zgartirishi mumkin bo'lgan kod yordamida kiritiladi. Ushbu kod quyidagi va asosiy kalitlarni buzadi:

try
{
    ...//Insert into view
}
catch (SqlException ex)
{
    if (ex.Number == 2627 || ex.Number == 2601)//Primary key exception, unique constraint violation
    {
        ...//Report the duplicate entry to the user
    }
    else
    {
        throw;
    }
}

Shuning uchun mening savolim quyidagicha: RAISERROR 2627 yoki 2601 raqam bilan istisno yaratish uchun tetikte foydalanishi mumkinmi?

1

2 javoblar

Yo'q. Keyingi versiyada MURADA (ehtimol)

Siz faqatgina sys.messages (50000+) yoki 50000-sonli matnni kiritgan xatlarni tashlaysiz. Yoki matnga kiritib, C# -ni o'zgartiring. Siz xatoliklarni 50000 dan kamroq tashlay olmaysiz

Agar ko'rinish juda murakkab bo'lsa, siz DRI dan foydalana olmaysiz, u holda ham murakkab. Bundan tashqari, siz o'zaro kelishuv muammosiga ega bo'lasiz: o'zingiz o'girganingizda qo'ng'iroqlar bir-biriga bog`liq bo`lganda sizning "yagona" turing.

1
qo'shib qo'ydi
@Paul: ular indekslangan ko'rinishni saqlash ushbu tuzilmalar bilan ko'p ishlov berishni talab qiladi. "Nima uchun tashqi JOINni kataloglashtirilgan ko'rinishda foydalana olmaydi?" Bo'limiga qarang. msdn.microsoft.com/en-us/library manziliga kiring. /dd171921%28SQL.100%29.aspx
qo'shib qo'ydi muallif gbn, manba
@Paul: ROW_NUMBER() butun indekslangan ko'rinishni qayta hisoblashni talab qiladi (ORDER BY joyidagi/almashtirishni o'zgartirish, bo'limni o'zgartirish va hk). Endeksli qarashlarning cheklanishiga yaxshi sabablar bor.
qo'shib qo'ydi muallif gbn, manba
Rahmat, adolatli. Mening tushuncham shuki, SQL-serverda faqat chapda birlashma, kasaba uyushmasi yo'q va sub-so'rovlar bo'lmaganda, jadvalga qarab qarashlargina indekslangan bo'lishi mumkin. Menimcha, bular juda murakkab ko'rinishga ega emas.
qo'shib qo'ydi muallif Paul, manba
Kechirasiz, SQL Server uchun indeksni saqlab qolish uchun juda murakkab emas, ko'rinish sifatida foydali bo'lish juda murakkab. Mening vaziyatimda ko'rinish tashqi qo'shimchalarga ega emas, lekin ROW_NUMBER() funktsiyasining natijasi asosida cheklashim uchun pastki so'rovga ega.
qo'shib qo'ydi muallif Paul, manba

Haqiqatan ham RAISE kodini asl asosiy kalitni buzganingizdan amin emasman. O'zingizning xatingiz bilan RAISE va catch bo'lishi mumkin. Bu, shuningdek, asl asosiy kalit buzilishi va o'zingizning shaxsiy qoidalaringizni taqsimlash imkonini beradi.

Ehtimol, buni amalga oshirishning eng dahshatli usuli ...

SQL kodi ( TRIGGER ta'rifi ehtimol) ...

RAISERROR('Custom View Violation',16,1);

C # ...

try 
{
    //execute SP/Insert etc...
}
catch (SqlException ex)
{
    if (ex.Message.Split('\r')[0] == "Custom View Violation")
    {
        //deal with your exception
    }
}
0
qo'shib qo'ydi
Rahmat ... agar asosiy kalit xatolikni bartaraf qilmasangiz, nima qilishim kerakligi haqida o'ylayman. Shu bilan bir qatorda, birlamchi kalit bilan vaqtinchalik jadvalga ikkita bir xil qadriyatlar qo'shish orqali asl asosiy kalit buzilishiga olib kelishi mumkin ... ikkalasi ham biroz xaqiqiy ko'rinadi: -S
qo'shib qo'ydi muallif Paul, manba
Ha, kelishib oldim. [va yana bir nechta belgilar]
qo'shib qo'ydi muallif Paul, manba
@Paul ha, ular biroz xakerlikdir - lekin mening xabarimdagi usul siz taklif qilgan double INSERT dan kamroq hacky ekanligini aytishim mumkin. RAISE xatolikni keltirib chiqaradigan va sizning maxsus istisnoingizni ushlab qolishning eng yaxshi usuli ekanligiga ishonchim komil, shuning uchun RAISERROR .
qo'shib qo'ydi muallif El Ronnoco, manba
to'ldiruvchi plomba plomba mashinasi
qo'shib qo'ydi muallif El Ronnoco, manba