Implementace zpracování chyb T-SQL

Dokončeno

Chyba značí problém nebo známý problém, ke kterému dochází během databázové operace. Databázový stroj SQL Serveru může vygenerovat chyby v reakci na událost nebo selhání na úrovni systému; nebo můžete v kódu Transact-SQL vygenerovat chyby aplikace.

Složky chyb databázového systému

Bez ohledu na příčinu se každá chyba skládá z následujících prvků:

  • Číslo chyby – jedinečné číslo identifikující konkrétní chybu
  • Chybová zpráva – text popisující chybu
  • Závažnost – číselná indikace závažnosti od 1 do 25.
  • Stav – kód interního stavu pro podmínku databázového stroje.
  • Procedura – název uložené procedury nebo triggeru, ve kterém došlo k chybě.
  • Číslo řádku – který příkaz v dávce nebo postupu vygeneroval chybu.

Systémové chyby

Systémové chyby jsou předdefinované a můžete je zobrazit v systémovém zobrazení sys.messages . Když dojde k systémové chybě, SQL Server může v závislosti na závažnosti chyby provést automatickou nápravnou akci. Například když dojde k chybě s vysokou závažností, SQL Server může databázi převést do offline režimu nebo dokonce zastavit službu databázového stroje.

Vlastní chyby

V kódu Transact-SQL můžete vygenerovat chyby, které reagují na podmínky specifické pro aplikaci, nebo přizpůsobit informace odeslané klientským aplikacím v reakci na systémové chyby. Tyto chyby aplikace lze definovat přímo tam, kde se generují, nebo je můžete předdefinovat v tabulce sys.messages spolu se systémem zadanými chybami. Čísla chyb používaná pro vlastní chyby musí být 50001 nebo vyšší.

Chcete-li přidat vlastní chybovou zprávu do sys.messages, použijte sp_addmessage. Uživatel zodpovědný za zprávu musí být členem pevně stanovené role serveru sysadmin nebo serveradmin.

Toto je syntaxe sp_addmessage:

sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg' 
     [ , [ @lang= ] 'language' ] 
     [ , [ @with_log= ] { 'TRUE' | 'FALSE' } ] 
     [ , [ @replace= ] 'replace' ]

Tady je příklad vlastní chybové zprávy používající tuto syntaxi:

sp_addmessage 50001, 10, N’Unexpected value entered’;

Kromě toho můžete definovat vlastní chybové zprávy, členové role serveru sysadmin mohou také použít další parametr , @with_log. Pokud je nastaveno na TRUE, chyba se také zaznamená do protokolu aplikací Windows. Všechny zprávy zapsané do protokolu aplikací systému Windows se také zapisuje do protokolu chyb SQL Serveru. Při použití možnosti @with_log buďte uvážliví, protože správci sítě a systémů zpravidla nemají rádi aplikace, které jsou příliš upovídané v systémových protokolech. Pokud však musí být chyba zachycena výstrahou, musí být chyba nejprve zapsána do protokolu aplikací systému Windows.

Poznámka:

Vyvolávání systémových chyb není podporováno.

Zprávy lze nahradit bez jejich první odstranění pomocí @replace možnosti = "nahradit".

Zprávy jsou přizpůsobitelné a pro stejné číslo chyby pro více jazyků lze přidat různé zprávy na základě hodnoty language_id.

Poznámka:

Anglické zprávy mají ID jazyka "1033".

Vyvolání chyb pomocí FUNKCE RAISERROR

Funkce PRINT i RAISERROR se dají použít k vrácení informací nebo zpráv s upozorněním do aplikací. RAISERROR umožňuje aplikacím vyvolat chybu, která by pak mohla být zachycena volajícím procesem.

RAISERROR

Možnost vyvolat chyby v jazyce T-SQL usnadňuje zpracování chyb v aplikaci, protože se odesílá stejně jako jakákoli jiná systémová chyba. RAISERROR se používá k:

  • Pomoc s řešením potíží s kódem T-SQL
  • Zkontrolujte hodnoty dat.
  • Vrátí zprávy, které obsahují text proměnné.

Poznámka:

Použití příkazu PRINT se podobá vyvolání chyby závažnosti 10.

Tady je příklad vlastní chybové zprávy pomocí FUNKCE RAISERROR.

RAISERROR (N'%s %d', -- Message text,
    10, -- Severity,
    1, -- State,
    N'Custom error message number',
    2)

Když je aktivováno, vrátí se:

Custom error message number 2

V předchozím příkladu je %d zástupným symbolem pro číslo a %s je zástupný symbol pro řetězec. Kromě toho byste měli poznamenat, že se nezmínilo číslo zprávy. Při vyvolání chyb s řetězci zpráv pomocí této syntaxe mají vždy číslo chyby 50000.

Vyvolání chyb pomocí funkce THROW

Příkaz THROW nabízí jednodušší metodu vyvolání chyb v kódu. Chyby musí mít minimálně číslo chyby 5 0000.

HODIT

THROW se liší od RAISERROR několika způsoby:

  • Chyby vyvolané THROW mají vždy závažnost 16.
  • Zprávy vrácené throw nesouvisí s žádnými položkami v sys.sysmessages.
  • Chyby vyvolané throw pouze způsobují přerušení transakce při použití ve spojení s SET XACT_ABORT ON a relace je ukončena.
THROW 50001, 'An Error Occured',0

Zachycení kódů chyb pomocí @@Error

Většina tradičních kódů zpracování chyb v aplikacích SQL Serveru byla vytvořena pomocí @@ERROR. Strukturované zpracování výjimek bylo zavedeno v SQL Serveru 2005 a poskytuje silnou alternativu k používání @@ERROR. Probereme ji v další lekci. Velké množství existujícího kódu zpracování chyb SQL Serveru je založeno na @@ERROR, takže je důležité pochopit, jak s ním pracovat.

@@ERROR

@@ERROR je systémová proměnná, která obsahuje číslo chyby poslední chyby, ke které došlo. Jednou z významných výzev s @@ERROR je, že hodnota, kterou obsahuje, se rychle resetuje při každém dalším příkazu.

Představte si například následující kód:

RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
PRINT 'Error=' + CAST(@@ERROR AS VARCHAR(8));
GO

Můžete očekávat, že při spuštění kódu vrátí číslo chyby ve vytištěném řetězci. Když se ale kód spustí, vrátí se:

Msg 50000, Level 16, State 1, Line 1
Message
Error=0

Chyba byla vyvolána, ale vytištěná zpráva byla Error=0. Na prvním řádku výstupu vidíte, že chyba byla ve skutečnosti 50 000, se zprávou předanou RAISERROR. Důvodem je to, že příkaz IF, který následuje za příkazem RAISERROR, byl úspěšně proveden a způsobil obnovení @@ERROR hodnoty. Z tohoto důvodu je při práci s @@ERROR důležité zachytit číslo chyby do proměnné, jakmile je vyvolána, a pak pokračovat ve zpracování s proměnnou.

Podívejte se na následující kód, který ukazuje toto:

DECLARE @ErrorValue int;
RAISERROR(N'Message', 16, 1);
SET @ErrorValue = @@ERROR;
IF @ErrorValue <> 0
PRINT 'Error=' + CAST(@ErrorValue AS VARCHAR(8));

Při spuštění tohoto kódu vrátí následující výstup:

Msg 50000, Level 16, State 1, Line 2
Message
Error=50000

Číslo chyby je nyní správně hlášeno.

Centralizované zpracování chyb

Dalším významným problémem s používáním @@ERROR pro zpracování chyb je, že je obtížné centralizovat kód T-SQL. Zpracování chyb má tendenci být roztroušené po celém kódu. Bylo by možné centralizovat zpracování chyb pomocí @@ERROR do určité míry pomocí popisků a příkazů GOTO. Většina vývojářů by však dnes na to hleděla jako na špatnou praxi kódování.

Vytváření chybových upozornění

U určitých kategorií chyb mohou správci vytvářet výstrahy SQL Serveru, protože chtějí být upozorněni, jakmile k nim dojde. To se může týkat i chybových zpráv definovaných uživatelem. Můžete například chtít vyvolat upozornění při každém vyplnění transakčního protokolu. Upozorňování se běžně používá k tomu, aby správci upozorňovali na chyby s vysokou závažností (například závažnost 19 nebo vyšší).

Vyvolávání výstrah

Výstrahy lze vytvořit pro konkrétní chybové zprávy. Služba upozorňování funguje tak, že se zaregistruje jako služba zpětného volání ve službě protokolování událostí. To znamená, že upozornění fungují jenom na protokolovaných chybách.

Existují dva způsoby, jak vytvořit chybu a vyvolat výstrahu – při vyvolání chyby můžete použít možnost WITH LOG nebo ji můžete změnit tak, aby byla zaprotokolována spuštěním sp_altermessage. Možnost WITH LOG ovlivňuje pouze aktuální příkaz. Použití sp_altermessage změní chování chyby pro všechna budoucí použití. Úpravy systémových chyb prostřednictvím sp_altermessage je možné pouze z SQL Serveru 2005 SP3 nebo SQL Serveru 2008 SP1 dále.