Używanie TRY/CATCH do obsługi błędów SQL Server

Instrukcja TRY/CATCH w Transact-SQL wykrywa i obsługuje warunki błędów w aplikacjach bazodanowych. To stwierdzenie jest kamieniem węgielnym SQL Obsługa błędów serwera i jest ważnym elementem tworzenia niezawodnych aplikacji bazodanowych.

TRY/CATCH dotyczy SQL Server począwszy od 2008, Azure SQL Database, Azure SQL Data Warehouse i Parallel Data Warehouse.

Przedstawiamy TRY/CATCH

TRY./CATCH działa, określając dwie instrukcje języka Transact-SQL: jedną, którą chcesz „wypróbować”, a drugą do „wyłapania” wszelkich błędów, które mogą wystąpić. Gdy SQL Server napotka instrukcję TRY/CATCH, natychmiast wykonuje instrukcję zawartą w klauzuli TRY. Jeśli instrukcja TRY zostanie wykonana pomyślnie, program SQL Server przejdzie dalej. Jeśli jednak instrukcja TRY wygeneruje błąd, SQL Server wykona instrukcję CATCH, aby poprawnie obsłużyć błąd.

Podstawowa składnia ma następującą postać:

ROZPOCZNIJ PRÓBĘ
{ sql_statement | blok instrukcji }
ZAKOŃCZ PRÓBĘ
ROZPOCZNIJ ZŁOWIENIE
[ { instrukcja_sql | instrukcja_bloku } ]
KOŃCÓWKA
[; ]
instagram viewer

TRY/CATCH Przykład

Rozważmy bazę danych zasobów ludzkich, która zawiera tabelę o nazwie pracowników, który zawiera informacje o każdym z pracowników firmy. Ta tabela wykorzystuje całkowity numer identyfikacyjny pracownika jako główny klucz.

Możesz spróbować użyć poniższego oświadczenia, aby wstawić nowego pracownika do swojej bazy danych:

INSERT INTO pracowników (id, imię, nazwisko, rozszerzenie)
WARTOŚCI (12497, 'Mike', 'Chapple', 4201)

W normalnych okolicznościach to stwierdzenie spowoduje dodanie wiersza do tabeli Pracownicy. Jeśli jednak pracownik o identyfikatorze 12497 już istnieje w bazie danych, wstawienie wiersza naruszyłoby ograniczenie klucza podstawowego i spowodowałoby następujący błąd:

Msg 2627, poziom 14, stan 1, wiersz 1
Naruszenie ograniczenia klucza podstawowego „PK_employee_id”. Nie można wstawić zduplikowanego klucza w obiekcie „dbo.employees”.
Oświadczenie zostało zakończone.

Chociaż ten błąd dostarcza informacji potrzebnych do rozwiązania problemu, występują z nim dwa problemy. Po pierwsze, wiadomość jest tajemnicza. Zawiera kody błędów, numery linii i inne informacje niezrozumiałe dla przeciętnego użytkownika. Po drugie, i co ważniejsze, powoduje przerwanie instrukcji i może spowodować awarię aplikacji.

Alternatywą jest zawinięcie instrukcji w instrukcję TRY…CATCH, jak pokazano tutaj:

ROZPOCZNIJ PRÓBĘ
INSERT INTO pracowników (id, imię, nazwisko, rozszerzenie)
WARTOŚCI (12497, 'Mike', 'Chapple', 4201)
ZAKOŃCZ PRÓBĘ
ROZPOCZNIJ ZŁOWIENIE
DRUKUJ 'BŁĄD:' + ERROR_MESSAGE( );
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Poczta pracownika',
@odbiorcy = '[email protected]',
@body = 'Wystąpił błąd podczas tworzenia nowego rekordu pracownika.',
@subject = 'Błąd bazy danych pracownika' ;
KOŃCÓWKA

W tym przykładzie wszelkie występujące błędy są zgłaszane zarówno użytkownikowi wykonującemu polecenie, jak i adresowi e-mail [email protected]. Błąd wyświetlany użytkownikowi to:

Błąd: naruszenie ograniczenia klucza podstawowego „PK_employee_id”. 
Nie można wstawić zduplikowanego klucza w obiekcie „dbo.employees”.
Poczta w kolejce.

Wykonywanie aplikacji jest kontynuowane normalnie, umożliwiając programiście obsługę błędu. Użycie instrukcji TRY/CATCH to elegancki sposób na proaktywne wykrywanie i obsługę błędów występujących w aplikacjach bazodanowych SQL Server.

Uczyć się więcej

Aby dowiedzieć się więcej o języku zapytań strukturalnych, zapoznaj się z naszym artykułem Podstawy SQL.

instagram story viewer