Павышэнне канкрэтнай памылкі ў T-SQL з RAISERROR

У мяне ёсць меркаванне, якое мае ЗАМЕСТ INSERT трыгер (у SQL Server 2005 г.). Калі карыстальнік ўводзіць у поле зроку, яны ў тым, што робіць ўстаўкі і абнаўленне шэрагу табліц. Выгляд досыць складзены, што ён не можа мець індэкс, так што, на жаль неабмежаваную.

Выгляд ўстаўляецца ў з C# з дапамогай кода, які быў бы праблематычным, каб змяніць. Гэты код ловіць першаснае і ўнікальныя ключы парушэнні з дапамогай наступных дзеянняў:

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;
    }
}

Так што маё пытанне: ці магу я выкарыстаць RAISERROR ў маім трыгер стварыць выключэнне з нумарам 2627 ці 2601?

1

2 адказы

Не, вы павінны чакаць кідок у наступнай версіі (можа быць)

Вы можаце толькі кінуць памылкі, якія вы паставілі ў sys.messages (50000+), або з тэкстам, які дае 50000. Ці ўстаўляць яго ў тэкст і змяніць свой C #. Вы не можаце кінуць памылка пазіцыянавання менш, чым 50000

Калі ўяўленне з'яўляецца настолькі складаным, што вы не можаце выкарыстоўваць DRI, то <�ет> занадта <�эм /> комплекс. Акрамя таго, вы будзеце мець праблемы паралелізму: дубляванне выклікаў будзе перапынку ваш «унікальнасць» у нейкі момант, калі вы выкінулі свой уласны.

1
дададзена
@Paul: яны робяць, таму што падтрыманне індэксаваная прадстаўлення патрабуюць шмат апрацоўкі з гэтымі канструкцыямі. Глядзіце «Чаму я не магу выкарыстоўваць OUTER JOIN ў індэксавацца зроку?» у msdn.microsoft.com/en-us/library /dd171921%28SQL.100%29.aspx
дададзена аўтар gbn, крыніца
@Paul: ROW_NUMBER() патрабуе ўсяго індэксаваная прадстаўлення пералічваць (змяненне месца/выдалення ў ORDER BY, змена раздзела і г.д.). Ёсць важкія падставы для абмежаванняў на індэксаваная уяўленнях.
дададзена аўтар gbn, крыніца
Дзякуй, дастаткова справядліва. Я разумею, што погляды схемы пераплёту не могуць быць праіндэксаваныя толькі ў SQL Server 2005 года, калі яны не маюць левага ня далучаецца, ня прафсаюзаў, а не подзапросов. На мой погляд, гэта не абавязкова рабіць выгляд занадта складаным.
дададзена аўтар Paul, крыніца
На жаль, я меў на ўвазе занадта складаны характар, каб быць карыснымі ў якасці пункту гледжання, не занадта складаная для SQL Server, каб падтрымліваць індэкс на. У маім выпадку, выгляд не мае знешнія злучэння, але мае подзапросов, так што я магу абмежаваць на падставе выніку функцыі ROW_NUMBER ().
дададзена аўтар Paul, крыніца

Я не ўпэўнены, калі вы можаце ПАВЫШЭННЕ непадробную першаснага ключа парушэнні. Хаця вы можаце ПАВЫШЭННЕ ўласныя памылкі з уласным паведамленнем, а затым ўлоў гэта. Гэта таксама дазволіць вам адрозніць сапраўднае першасным ключ парушэнні і ўласных парушэнні мытных.

Магчыма найгрубейшай шлях для дасягнення гэтай мэты было б ...

SQL-кода (у TRIGGER вызначэнне можа быць) ...

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
дададзена
Дзякуй ... што цалкам можа быць, што мне трэба рабіць, калі павышэнне першаснай памылкі ключа не можа быць зроблена. З іншага боку, я мог бы выклікаць непадробнае першасны ключ парушэнне, уставіўшы два аднолькавых значэнняў ў часовую табліцу з першасным ключом ... і здаецца трохі Hacky, хоць: -S
дададзена аўтар Paul, крыніца
Так, пагадзіўся. [І яшчэ некалькі знакаў]
дададзена аўтар Paul, крыніца
@Paul ды яны трохі Hacky - хоць я б сказаў, што гэты метад у маім пасце менш Hacky, чым падвоеная INSERT вы прапануеце. Я таксама ўпэўнены, што ёсць лепшы спосаб ПАВЫШЭННЕ ІНГАЎ памылкі і лавіць вашыя канкрэтныя выключэння, так, верагодна, лепш, каб прачытаць уверх на ўваходах і выхадах RAISERROR ,
дададзена аўтар El Ronnoco, крыніца
:) напаўняльнік напаўняльнік напаўняльнік
дададзена аўтар El Ronnoco, крыніца