T-SQL:n virheenkäsittelyn toteuttaminen
Virhe ilmaisee ongelman tai tärkeän ongelman, joka ilmenee tietokantatoiminnon aikana. SQL Server -tietokantamoduuli voi luoda virheitä vastauksena tapahtumaan tai virheeseen järjestelmätasolla. tai voit luoda sovellusvirheitä Transact-SQL koodiin.
Tietokantamoduulin virheiden elementit
Syystä riippumatta jokainen virhe muodostuu seuraavista elementeistä:
- Virhenumero – Yksilöllinen luku, joka tunnistaa tietyn virheen.
- Virhesanoma – Virhettä kuvaava teksti.
- Vakavuus - Numeerinen merkki vakavuudesta 1–25.
- Tila – Tietokantamoduulin ehdon sisäinen tilakoodi.
- Toimintosarja : tämä on sen tallennetun toimintosarjan tai käynnistimen nimi, jossa virhe ilmeni.
- Rivin numero – Mikä erä- tai toimintosarjan lauseke aiheutti virheen.
Järjestelmävirheet
Järjestelmävirheet on määritetty valmiiksi, ja voit tarkastella niitä sys.messages-järjestelmänäkymässä . Kun järjestelmävirhe ilmenee, SQL Server voi suorittaa automaattisen korjaustoiminnon virheen vakavuuden mukaan. Jos esimerkiksi tapahtuu suuren vakavuuden virhe, SQL Server voi viedä tietokannan offline-tilaan tai jopa pysäyttää tietokantamoduulin palvelun.
Mukautetut virheet
Voit luoda virheitä Transact-SQL koodissa, jos haluat vastata sovelluskohtaisiin ehtoihin tai mukauttaa asiakassovelluksiin lähetettyjä tietoja järjestelmävirheiden johdosta. Nämä sovellusvirheet voidaan määrittää tekstiin, jossa ne luodaan, tai voit määrittää ne valmiiksi sys.messages-taulukossa yhdessä järjestelmän toimittamien virheiden kanssa. Mukautettuihin virheisiin käytettyjen virhenumeroiden on oltava vähintään 50001.
Jos haluat lisätä mukautetun virhesanoman sys.messages-tiedostoon, käytä sp_addmessage. Sanoman käyttäjän on oltava järjestelmänvalvojan tai palvelimen järjestelmänvalvojan kiinteiden palvelinroolien jäsen.
Tämä on sp_addmessage-syntaksi:
sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg'
[ , [ @lang= ] 'language' ]
[ , [ @with_log= ] { 'TRUE' | 'FALSE' } ]
[ , [ @replace= ] 'replace' ]
Tässä on esimerkki mukautetusta virhesanomasta, jossa käytetään tätä syntaksia:
sp_addmessage 50001, 10, N’Unexpected value entered’;
Lisäksi voit määrittää mukautettuja virhesanomia, joissa sysadmin-palvelinroolin jäsenet voivat käyttää myös lisäparametria , @with_log. Kun arvoksi on määritetty TRUE, virhe kirjataan myös Windowsin sovelluslokiin. Windowsin sovelluslokiin kirjoitettu viesti kirjoitetaan myös SQL Serverin virhelokiin. Noudata harkiten -asetuksen käyttöä @with_log , koska verkon ja järjestelmänvalvojat yleensä poistavat käytöstä sovelluksia, jotka ovat järjestelmälokeissa "puheliaita". Jos virhe kuitenkin tarvitsee jäädä ilmoituksen vangiksi, virhe on ensin kirjoitettava Windowsin sovelluslokiin.
Huomautus
Järjestelmävirheiden keräämistä ei tueta.
Viestit voidaan korvata poistamatta niitä ensin käyttämällä @replace ='replace'-vaihtoehtoa.
Viestit ovat mukautettavissa, ja saman virhenumeron voi lisätä useille kielille language_id arvon perusteella.
Huomautus
Englanninkieliset viestit ovat language_id 1033.
Virheiden korotus käyttämällä RAISERROR-toiminnolla
Sekä PRINT- että RAISERROR-funktiota voidaan käyttää tietojen tai varoitussanomien palauttamiseen sovelluksiin. RAISERROR-funktion avulla sovellukset voivat aiheuttaa virheen, joka saattaa tämän jälkeen jäädä kutsumisprosessin suorittamaksi.
RAISERROR
Mahdollisuus aiheuttaa virheitä T-SQL:ssä helpottaa virheenkäsittelyä sovelluksessa, koska se lähetetään kuten muutkin järjestelmävirheet. RAISERROR-lausekkeen avulla:
- T-SQL-koodin vianmääritys.
- Tarkista tietojen arvot.
- Palauta viestit, jotka sisältävät muuttujatekstiä.
Huomautus
PRINT-lausekkeen käyttäminen muistuttaa vakavuusasteen 10 virheen esille nostamista.
Tässä on esimerkki mukautetusta virhesanomasta, joka käyttää RAISERROR-funktiota.
RAISERROR (N'%s %d', -- Message text,
10, -- Severity,
1, -- State,
N'Custom error message number',
2)
Kun se käynnistetään, se palauttaa:
Custom error message number 2
Edellisessä esimerkissä %d on luvun paikkamerkki ja %s on merkkijonon paikkamerkki. Huomaa myös, että viestinumeroa ei ole mainittu. Kun viestimerkkijonojen virheet annetaan käyttämällä tätä syntaksia, niiden virhenumero on aina 50000.
Virheiden korotus throw-toiminnolla
THROW-lauseke tarjoaa yksinkertaisemman menetelmän virheiden lisäämiseen koodiin. Virheiden virheluvun on oltava vähintään 5 0000.
HEITÄ
THROW-arvo eroaa RAISERROR-tavasta useilla eri tavoilla:
- THROW-itteellä esiin tuodut virheet ovat aina vakavuusaste 16.
- THROW-funktion palauttamat viestit eivät liity mihinkään sys.sysmessages-merkinnäseen.
- THROW-toiminnon aiheuttamat virheet aiheuttavat tapahtuman keskeyttämisen vain, kun niitä käytetään yhdessä SET-XACT_ABORT ON kanssa ja istunto lopetetaan.
THROW 50001, 'An Error Occured',0
Virhekoodien sieppaaminen @@Error avulla
Useimmat perinteiset virheenkäsittelykoodit SQL Server -sovelluksissa on luotu @@ERROR käyttämällä. Jäsennetty poikkeusten käsittely otettiin käyttöön SQL Server 2005:ssä, ja se tarjoaa vahvan vaihtoehdon @@ERROR käyttämiselle. Siitä keskustellaan seuraavalla oppitunnilla. Suuri osa olemassa olevasta SQL Server -virheenkäsittelykoodista perustuu @@ERROR, joten on tärkeää ymmärtää, miten sitä käsitellään.
@@ERROR
@@ERROR on järjestelmämuuttuja, joka sisältää viimeisimmän tapahtuneen virheen virhenumeron. Yksi merkittävä haaste @@ERROR on se, että sen sisältämä arvo nollataan nopeasti, kun jokainen lisälauseke suoritetaan.
Katso esimerkiksi seuraavaa koodia:
RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
PRINT 'Error=' + CAST(@@ERROR AS VARCHAR(8));
GO
Koodin suorittamisen aikana saatat olettaa, että se palauttaa tulostetun merkkijonon virhenumeron. Kun koodi suoritetaan, se kuitenkin palauttaa:
Msg 50000, Level 16, State 1, Line 1
Message
Error=0
Virhe ilmeni, mutta tulostettu sanoma oli "Error=0". Tulosteen ensimmäisellä rivillä näet, että virhe oli odotetulla tavalla itse asiassa 50000, ja viesti välitettiin RAISERROR-parametrille. Tämä johtuu siitä, että RAISERROR-lausekkeen jälkeen oleva IF-lauseke suoritettiin onnistuneesti ja aiheutti @@ERROR arvon nollaamisen. Tästä syystä @@ERROR käsiteltäessä on tärkeää siepata virhenumero muuttujaan heti, kun se on annettu, ja jatkaa sitten muuttujan käsittelemistä.
Katso seuraavaa koodia, joka osoittaa tämän:
DECLARE @ErrorValue int;
RAISERROR(N'Message', 16, 1);
SET @ErrorValue = @@ERROR;
IF @ErrorValue <> 0
PRINT 'Error=' + CAST(@ErrorValue AS VARCHAR(8));
Kun tämä koodi suoritetaan, se palauttaa seuraavat tulokset:
Msg 50000, Level 16, State 1, Line 2
Message
Error=50000
Virhenumero ilmoitetaan nyt oikein.
Virheenkäsittelyn keskittäminen
Toinen merkittävä ongelma @@ERROR käytössä virheenkäsittelyssä on se, että sitä on vaikea keskittää T-SQL-koodiin. Virheiden käsittely saattaa päätyä hajallaan koko koodiin. Virheiden käsittelyn voi jossain määrin keskittää käyttämällä @@ERROR tunnisteita ja GOTO-lausekkeita. Useimmat kehittäjät eivät kuitenkaan pitäisi tätä huonona koodauskäytäntönä.
Virheilmoitusten luominen
Tietyissä virheluokissa järjestelmänvalvojat saattavat luoda SQL Server -ilmoituksia, koska he haluavat saada ilmoituksen heti, kun nämä tapahtuvat. Tämä voi koskea myös käyttäjän määrittämiä virhesanomia. Saatat esimerkiksi haluta lisätä ilmoituksen aina, kun tapahtumaloki täyttyy. Ilmoitusten avulla järjestelmävalvojat kiinnittävät huomiota suuriin vakavuusvirheisiin (kuten vakavuuslukuun 19 tai enemmän).
Hälytysten esittäminen
Hälytyksiä voidaan luoda tietyille virhesanomia varten. Ilmoituspalvelu toimii rekisteröimällä itsensä tapahtuman kirjauspalvelun takaisinkutsupalveluksi. Tämä tarkoittaa sitä, että hälytykset toimivat vain kirjatuissa virheissä.
Virhe voi aiheuttaa hälytyksen kahdella tavalla – voit käyttää WITH LOG -asetusta, kun lisäät virheen, tai viestiä voidaan muuttaa niin, että se kirjataan suorittamalla sp_altermessage. WITH LOG -asetus vaikuttaa vain nykyiseen lausekkeeseen. sp_altermessage käyttäminen muuttaa virheen toimintaa myöhempää käyttöä varten. Järjestelmävirheiden muokkaaminen sp_altermessage avulla on mahdollista vain SQL Server 2005 SP3:sta tai SQL Server 2008 SP1:stä eteenpäin.