piektdiena, 2012. gada 13. janvāris

Ziņojumu izvadīšana izmantojot RAISERROR

"RAISERROR" tiek izmantots, lai radītu kļūdas vai izvadītu ziņojumus (kas nav kļūdas) ar T-SQL palīdzību. Šajā rakstā par šīs konstrukcijas parametriem, With daļu un daži piemēri ar komentāriem.

Sintakse (no msdn) ir šāda:
RAISERROR ( { msg_id | msg_str | @local_variable }
    { ,severity ,state }
    [ ,argument [ ,...n ] ] )
    [ WITH option [ ,...n ] ] 
Parametri
Pirmajā parametrā var norādīt skaitli, kas norāda lietotāja definētas kļūdas ziņojuma numuru (par to šeit plašāk neko nerakstīšu) vai ziņojuma tekstu, kas tiek atgriezts komandas izpildītājam (tādā gadījumā kļūdas numurs vienmēr būs 50000). Nepieciešamības gadījumā, ziņojumu var arī noformēt.

Otrajā parametrā ir Severity (msdn).
0..10 tiek radīts "Brīdinājums", kas tiek atgriezts izsaucošajai aplikācijai, bet neiespaido skripta darbību. Ja norāda 0 vai 10, tad atšķirībā no pārējiem gadījumiem, neizvada uz ekrāna ziņojuma numuru. (šo niansi, starp citu, dokumentācijā neesmu redzējis).
11-18 radīts kļūdas ziņojums, kļūda tiek apstrādāta Catch blokā, ja tāds ir norādīts.
19 radīts nopietnas kļūdas ziņojums- lai tādu komandu izpildītu jāpieder sysadmin lomai un jābūt norādītam parametram "With Log" (par to tālāk rakstā)
20.. tas pats kas iepriekš un vēl papildus tiek pārtraukts savienojums ar serveri.

Trešajā parametrā ir State (msdn).
Piemēram- ja no vienas procedūras tiek mests viens un tas pats kļūdas ziņojums vairākās vietās, tad lai vēlāk atrastu problemātisko vietu, var izmantot šo parametru. Vērtībai jābūt no 1..127 (tas būtu "drošais" intervāls, bet SQL Server 2008 R2 dokumentācijā pieļauj plašāku vērtību diapazonu).

Par "RAISERROR" lietošanu ir šāds raksts msdn. Tiesa, neliekas pārāk izsmeļošs.

WITH daļa 
* LOG- šo var izmantot tikai tad, ja esi sysadmin vai ar ALTER TRACE tiesībām. Respektīvi- izveidot procedūru, kas izmanto šo parametru var tikai tad, ja ir ļoti augstas tiesības serverī.
Bet parametrs kā tāds ir ļoti vērtīgs ar to, ka ziņojums (līdz 440 baitiem) tiek reģistrēts SQL Server audita failā (kā to apskatīt- SQL Server audita (Log) faila apskate).

* NOWAIT- ziņojums tiek sūtīts klienta lietojumam nekavējoties. Piemēram, procedūra normālā gadījumā izpildās, izpildes beigās tiek atgriezti rezultāti. Bet ja nepieciešams jau procedūras izpildes laikā saņemt ziņojumus, tad NOWAIT to atrisina (lieliski noder, lai vērotu procedūras izpildes progresu). Šeit var izlasīt vairāk par to.

* SETERROR- Gadījumā, ja ziņojuma "Severity" ir mazāka par par 10 (brīdinājums), tad pēc noklusējuma @@error netiek uzstādīts. Tomēr ja nepieciešams lai tas tiktu uzstādīts, tad jānorāda šis parametrs. Šobrīd neredzu šim parametram pievienoto vērtību.

Daži piemēri
Lai "vērotu" procedūras darbību un ātrdarbību, tajā var salikt informatīvus paziņojumus. To var izdarīt arī ar "Print" palīdzību, bet RAISERROR ir vairāk funkcionalitātes. Tā kā informatīvajiem paziņojumiem nav nepieciešams zināt ziņojuma numuru, to darītu tā:
RAISERROR ('Procedūra sāk darbu', 0, 1)
Monitorējot procedūru tās izpildes laikā un ziņojumu uzreiz izvadītu uz ekrāna (nevis gaidītu procedūras beigas), jāpapildina ar WITH daļu:
RAISERROR ('Procedūra sāk darbu', 0, 1) WITH NOWAIT
Ja esat sysadmin vai ALTER TRACE tiesībām, to var papildināt tā, lai dati tikti reģistrēti audita failā (starp citu- šis arī viens no veidiem, kā var piefiksēt procedūras faktu arī ja tā notiek transakcijā un vēlāk transakcija tiek atcelta):
RAISERROR ('Procedūra sāk darbu', 0, 1) WITH NOWAIT, LOG
Ja ir nepieciešams radīt kļūdu, tad izmantoju šādu sintaksi (Severity parasti lieku 16):
RAISERROR ('Procedūrā ir kļūda!', 16, 1)
Bet tomēr jāņem vērā, ka kļūdas ziņojums ir tad, ja ir kļūda, nevis paredzama situācija. Piemēram, parametra validācijas rezultātu šādi apstrādāt nebūt nav labi- labāk izmantot procedūras atgriezto vērtību (return 0), vai output parametru. Tas ir svarīgi arī no ātrdarbības viedokļa.

Laba ideja procedūru atkļūdošanai ir izmantot parametru, kas norāda, kādā režīmā procedūra tiek laista. Noklusēto vērtību uzliekot uz "Nē". Piemēram:
Create Proc dbo.MyProc
(
    @debug bit = 0
)
As
Begin
    If(@debug = 1)
        RAISERROR ('Procedūra sākas', 0, 1) WITH NOWAIT;
    -- Pārējais kods šeit
End

Nav komentāru:

Ierakstīt komentāru