SQL-сервер қателерін басқару үшін CATCH-ті қолданыңыз

Қателерді орындауға кедергі келтірмей анықтаңыз

Transact- SQL бағдарламасындағы TRY ... CATCH мәлімдемесі дерекқор бағдарламаларының қате жағдайларын анықтайды және өңдейді. Бұл мәлімдеме SQL Server қателерді өңдеудің іргетасы болып табылады және сенімді дерекқор бағдарламаларын әзірлеудің маңызды бөлігі болып табылады. TRY ... CATCH SQL Server 2008-ге дейін, Azure SQL дерекқоры, Azure SQL деректер қоймасы және Параллельді деректер қоймасы үшін қолданылады.

TRY..CATCH таныстырыңыз

TRY ... CATCH екі Transact-SQL операторын көрсетуге мүмкіндік береді: біреуі «тырысқыңыз» және басқалары туындауы мүмкін кез келген қателерді «ұстап» алу үшін қолданыңыз. SQL Сервері TRY ... CATCH мәлімдемесімен кездескенде, ол TRY тармағында қамтылған мәлімдемені дереу орындайды. Егер TRY үзіндісі сәтті орындалса, SQL Server жай қозғалады. Алайда, егер TRY операторы қате туғызса, SQL Server қатені қатесіз өңдеу үшін CATCH сөзін орындайды.

Негізгі синтаксис осы пішінді қабылдайды:

BEGIN TRY {sql_statement | statement_block} АЯҚТЫҢ БІРІНШІ КЕЗЕҢІЗ [{sql_statement | statement_block}] END CATCH [; ]

TRY ... CATCH мысал

Бұл мысалды қолдану арқылы түсіндіру оңай. Өзіңіздің ұйымыңыздағы қызметкерлердің әрқайсысы туралы ақпаратты қамтитын «Қызметкерлер» атты кестені қамтитын адам ресурстарының дерекқорының әкімшісі екеніңізді елестетіп көріңіз. Бұл кесте бастапқы кілт ретінде бүтін қызметкер идентификаторын пайдаланады. Дерекқорыңызға жаңа қызметкер қосу үшін төмендегі мәлімдемені қолдануға тырысыңыз:

INSERT INTO қызметкерлері (id, first_name, last_name, extension) VALUES (12497, 'Майк', 'Chapple', 4201)

Қалыпты жағдайда бұл мәлімдеме Қызметкерлер кестесіне жол қосады. Дегенмен, дерекқорда ID 12497 бар қызметкер бұрыннан бар болса, жолды кірістіру бастапқы кілт шектеулерін бұзады және келесі қатеге әкеледі:

Msg 2627, Level 14, State 1, Line 1 PRIMARY KEY шектеуін бұзу 'PK_employee_id'. 'Dbo.employees' нысанындағы қайталанатын кілт енгізе алмайды. Өтініш тоқтатылды.

Бұл қате сізді ақаулықты түзету үшін қажет ақпаратпен қамтамасыз етеді, бірақ онымен байланысты екі мәселе бар. Біріншіден, хабарлама криптиялық. Ол қате кодтарды, жол нөмірлерін және орта пайдаланушыны түсінуге болмайтын басқа ақпаратты қамтиды. Екіншіден, және одан да маңызды, бұл өтінішті тоқтатуға және бағдарламаның бұзылуына әкелуі мүмкін.

Балама, төменде көрсетілгендей, мәлімдемені TRY ... CATCH мәлімдемесіне орауға болады:

BEGIN TRY INSERT INSERT IN employees (id, first_name, last_name, extension) БАҒДАРЛАМАЛАР (12497, 'Майк', 'Chapple', 4201) END TEXT BEGIN CATCH PRINT 'Қате:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Қызметкердің поштасы', @recipients = 'hr@foo.com', @body = 'Жаңа қызметкер жазбасын жасау кезінде қате пайда болды.', @subject = 'Қызметкердің идентификаторының қайталану қатесі'; END CATCH

Бұл мысалда туындайтын кез келген қателер пәрменді және hr@foo.com электрондық пошта мекенжайын орындаушы пайдаланушыға да беріледі. Пайдаланушыға көрсетілетін қате төменде пайда болады:

Қате: PRIMARY KEY шектеуін бұзу 'PK_employee_id'. 'Dbo.employees' нысанындағы қайталанатын кілт енгізе алмайды. Пошта кезегі қойылды.

Ең бастысы, бағдарламалар орындалуын қалыпты түрде жалғастырады, бұл бағдарламашыға қатені қате өңдеуге мүмкіндік береді. TRY ... CATCH сөзін пайдалану SQL Server дерекқор бағдарламаларында орын алған қателерді алдын-ала анықтау және өңдеудің талғампаз тәсілі.

Көбірек білу

Егер сіз Құрылымдық Сұрау тілі туралы көбірек білгіңіз келсе , SQL-ге кіріспе сөзін оқыңыз.