In de online instructies voor het script dat de TSQLTutorJoins voorbeelddatabase aanmaakt uit mijn eerdere kolommen, raad ik u aan osql te gebruiken.exe om het script uit te voeren vanaf de opdrachtprompt. Om aan te tonen waarom, baseer ik de column van deze maand op RAISERROR en een coole truc die ik heb geleerd over het gebruik van de staatsparameter van de raiserror statement. Met behulp van een speciale waarde voor de raiserror state parameter, kunt u de beëindiging van een complex script forceren en de uitvoering ervan in de verkeerde database voorkomen.,
RAISERROR heeft drie primaire componenten: de fouttekst, de ernst en de toestand. De fouttekst kan een hard-gecodeerd of geparametreerd bericht zijn of een foutnummer van een permanent door de gebruiker gedefinieerd bericht. Om uw eigen permanente berichten te maken, Zie SQL Server Books Online (BOL) over het gebruik van de systeem opgeslagen procedure sp_addmessage.
Ernst heeft verschillende gedefinieerde niveaus. Door ontwikkelaars gedefinieerde fouten variëren in ernst van 1 tot 16, waarbij 16 de meest voorkomende en standaard is. Echter, niet alle severities werken op dezelfde manier., Tabel 1 toont de ernst categorieën, hoe ze berichten weer te geven in Query Analyzer,en hoe ze optioneel zijn aangemeld in de log van de logboekregistratie van de logboekregistratie van de logboekregistratie van de logboekregistratie van de logboekregistratie. Om berichten te loggen naar de LogViewer, kun je met LOG in je raiserror statement gebruiken of het permanente bericht aanmaken door sp_addmessage te gebruiken met de with_log parameter ingesteld op ‘TRUE’. Deze laatste keuze zal elk voorkomen van deze fout naar het logboekbestand van de logboekweergave schrijven, zelfs als RAISERROR niet specificeert met LOG., De vereenvoudigde RAISERROR syntaxis is
RAISERROR (error, severity, state) WITH LOG
bijvoorbeeld
RAISERROR ('Test Severity 16', 16, 1) WITH LOG
geeft de volgende fout terug naar het venster berichten in Query Analyzer:
Error Number InfoServer: Msg 50000, Level 16, State 1, Line 1Error Text Test Severity 16
de eerste regel is de informatie over het foutnummer, zoals Tabel 1 beschrijft. Query Analyzer geeft deze informatie niet weer voor Ernst 10. De kleur van het scherm verandert van zwart voor severities 1 tot en met 9 naar rood voor 11 en hoger. Het voorbeeldscript in Lijst 1 toont extra syntaxis en ideeën voor het gebruik van RAISERROR, inclusief het gebruik van meerdere talen en parametrering., Voor meer informatie over het gebruik van RAISERROR en de verschillende severities, zie BOL onder de volgende onderwerpen: foutmeldingen, Foutmelding Ernst niveaus, RAISERROR, het gebruik van RAISERROR, FORMATMESSAGE, en xp_logevent.
naast de ernst ondersteunt RAISERROR ook een toestand. Veel object-creatie scripts maken een database en vervolgens tabellen, procedures, enzovoort binnen de nieuw aangemaakte database. Maar wat als het script de database niet goed heeft aangemaakt? Alle extra objecten (bijv.,, tabellen, procedures) worden aangemaakt in uw standaarddatabase, die voor systeembeheerders master zou kunnen zijn. Het maken van al uw door de gebruiker gedefinieerde databaseobjecten in de masterdatabase is precies wat u niet wilt, dus wanneer u een geautomatiseerd proces scriptt, kunt u een waarde voor status toevoegen die het script beëindigt als er een fatale (volgens uw definitie) fout optreedt.
het instellen van de statuswaarde lijkt echter niet altijd de sessie te beëindigen. Toepassingen zoals Query Analyzer kunnen automatisch opnieuw verbinding maken wanneer een verbinding wordt verbroken., Dus, om volledig te zien het voordeel van de staat optie, je nodig hebt om een tool zoals osql gebruiken.exe, die niet automatisch opnieuw verbinding maakt nadat een verbinding is verbroken. Hier is een manier om de staat optie te testen. Typ vanaf de opdrachtprompt
osql -E -q"RAISERROR('Test Severity 16', 16, 1) WITH LOG"
deze code geeft
Test Severity 161>
en u blijft in osql.executable. Het uitvoeren van de volgende regel vanaf een opdrachtprompt:
osql -E -q"RAISERROR('Test State 127', 16, 127) WITH LOG"
geeft de foutmelding
Test State 127
en geeft u terug naar de opdrachtprompt, waarbij u wordt afgesloten vanuit osql.executable. Als u osql gebruikt.,exe om een fout te maken met een status van 127 nadat het aanmaken van een database mislukt, beëindigt de foutstatus de verbinding en daarmee de rest van het script, zodat u geen objecten in de verkeerde database maakt.
aan het begin van het database-creatiescript TSQLTutorJoins.sql, beschikbaar via de link” Download de Code ” bovenaan de pagina, is de volgende code:
als de database niet is aangemaakt, wordt de verbinding verbroken en wordt het object-creatiegedeelte van het script niet uitgevoerd. Ik heb het zo opgezet om u te laten bepalen wat de fouten zijn (bijv.,, geen schijfruimte, onjuist pad) voordat de rest van het script wordt uitgevoerd. Zonder deze code, als het aanmaken van de database mislukt en het script doorgaat, zou het alle testobjecten in uw standaard database aanmaken.
wanneer u scripts automatiseert, kan het beëindigen van de uitvoering bij een ernstige fout zeer nuttig zijn. Door een fout met een hoge ernst te verhogen, deze te loggen in het Logboekboek van de logboeken van de logboeken, en nog belangrijker, deze te verhogen met een status van 127, zorgt u ervoor dat er geen scriptobjecten worden gemaakt in de verkeerde database., Bovendien, door het in te loggen in de logboekregistratie van de logboeken, heb je een audit trail van de gebeurtenis.