Database
 sql >> Datenbank >  >> RDS >> Database

Lesen und Interpretieren von SQL-Fehlern

Fehlercodes in SQL werden vom Server generiert, um Informationen darüber bereitzustellen, was schief gelaufen ist. Sie haben je nach verwendeter SQL-Version unterschiedliche Bedeutungen, weisen jedoch normalerweise darauf hin, dass eine angeforderte Operation nicht ausgeführt werden kann.

Der einfachste Weg, es zu erkunden, ist die einfachste Programmiersprache namens BASIC und ihre Programme wie „Hello World“. Geben Sie Folgendes in die Schnittstelle ein:

PRINT "Hello, World!"

Wenn Sie PRINT als PRRRR eingeben, erhalten Sie eine Fehlermeldung (eine Entsprechung im wirklichen Leben wäre, dass Ihnen jemand sagt, dass Sie auf der rechten Straßenseite fahren sollen, z. B. um die Regeln zu befolgen).

Das ist relativ einfach, wenn es um einfache Operationen geht, aber was ist mit komplexeren Systemen? Wir fügen hier auch SQL-Codebeispiele ein. Viel Spaß!

Der folgende Code importiert die erforderlichen Funktionen aus der Standardbibliothek, erstellt dann eine Konsole, erhält einen Zeiger auf ihren Standardausgabestrom, gibt die Nachricht an diesen Strom aus und gibt verwendete Objekte frei:

Option Explicit

    Declare Function AllocConsole Lib "kernel32" () As Long
    Declare Function FreeConsole Lib "kernel32" () As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
    Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" _
           (ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal _
           nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, _
           lpReserved As Any) As Long
    Declare Function Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Long

Private Sub Main()
    'create a console instance
    AllocConsole
    'get handle of console output
    Dim hOut As Long
    hOut = GetStdHandle(-11&)
    'output string to console output
    Dim s As String
    s = "Hello, World!" & vbCrLf
    WriteConsole hOut, ByVal s, Len(s), vbNull, vbNull
    'make a pause to look at the output
    Sleep 2000
    'close the handle and destroy the console
    CloseHandle hOut
    FreeConsole
End Sub

Wenn Sie in diesem Code einen Fehler machen, dauert es eine Weile, bis Sie ihn finden, insbesondere wenn Sie 500 Seiten Code wie diesen haben. Der Computer wird also Fehler finden und Sie darauf hinweisen, wo sie sind.

Wozu dienen SQL-Fehlercodes und wie funktionieren sie?

Der Nutzen von SQL-Fehlercodes besteht darin, dass die Software Ihren Code findet und darauf verweist (Beispiel). Sie müssen nicht selbst Tausende von Codezeilen manuell überprüfen. Stellen Sie sich vor, Sie erhalten immer nur einen Fehlercode („Viel Glück beim nächsten Mal, Verlierer!“ oder „Wer hat Ihnen das Programmieren beigebracht, ein Pferd?“) und müssen das ganze Projekt noch einmal durchgehen!

Fehlercodes sind gewissermaßen die kleinen Helfer des Weihnachtsmanns:übersichtlich, nützlich und zeitsparend. Man muss sie nur kennenlernen.

Beginnend mit der Grundstufe sind Datenbanken Sammlungen von Informationen, die zusammengestellt und klassifiziert werden. Der Typ, an dem wir interessiert sind, sind relationale Datenbanken, was bedeutet, dass es Beziehungen zwischen den Zellen gibt, in denen die Daten gespeichert sind.

Sie haben beispielsweise eine ganze Gruppe von Studenten an einer Universität und möchten alle, die bei ihren Prüfungen mehr als 90 % erreicht haben, mit einem Preis auszeichnen. Sie könnten ihre Namen, Geschlechter, Adressen, Bankkontonummern (diese sind alle verwandt, daher relationale Datenbanken), Noten manuell schreiben und dann manuell diejenigen mit hohen Punktzahlen auswählen.

Archaisch? Ja, aber Sie wären überrascht zu erfahren, wie viele Unternehmen im 21. Jahrhundert immer noch auf diese Weise Geschäfte machen. Es könnte Monate dauern, Vorgänge abzuschließen, für die ein Computer Sekunden benötigen würde. Vor allem, wenn wir von Hunderten oder Tausenden von Schülern sprechen.

Wenn Sie nun all diese Schüler in eine Datenbank stecken, könnten Sie eine Sprache wie SQL verwenden:

SELECT * FROM Student WHERE Percentage>=90;

Erledigt! Die Probleme beginnen jedoch, wenn Sie Ihren Code schreiben.

Verständlicherweise wird es sehr komplex, je mehr Sie also schreiben, desto höher ist die Wahrscheinlichkeit, dass Ihr Code Fehler enthält. Hier sind Fehlercodes am nützlichsten. Wenn wir Fehlercodes sehen, sollten wir dankbar sein (was uns nicht davon abhält, sie jedes Mal zu beschimpfen). Sie erledigen die gesamte Kleinarbeit für Sie, und alles, was Sie tun müssen, ist, zur Quelle zu gehen und das Problem zu beheben.

Geben Sie mir einige Einzelheiten!

Wenn eine Datenbank nicht die gewünschten Ergebnisse liefert, wird ein Fehlercode ausgegeben. Es hilft, das Problem zu identifizieren und es zu beheben. SQL-Fehlercodes wie die folgenden sind hilfreich, wenn Sie Probleme mit Ihren Datenbanken beheben:

Oracle9i-Datenbankfehlermeldungen

Version 2 (9.2)

ORA-00904:„Angegebene Zeilenanzahl überschreitet Maximum“.

ORA-00900:„Unzureichende Berechtigungen für Objekt“.

ORA-00900:„ungültige SQL-Anweisung“.

ORA-00902:„ungültiger Datentyp“.

Wir haben viele verschiedene Arten von Fehlern in SQL. Aber wenn Sie sie nicht einrahmen und an Ihre Wand hängen wollen, müssen Sie wissen, wie Sie mit ihnen umgehen. Das Gute daran ist, dass SQL-Fehler mit einem Link zur genauen Stelle des Fehlers in einem Code versehen sind und auch Informationen darüber enthalten, was falsch ist.

Beginnen wir mit dem einfachsten Fehlerbeispiel:

ORA-00900:„ungültige SQL-Anweisung“.

Wie Sie wahrscheinlich schon erraten haben, müssen Sie den Befehl richtig aufschreiben. Es könnte einen Tippfehler oder ein Komma geben, wo es nicht hingehört. Oder Sie müssen ggf. zusätzliche Software installieren:

„Die Anweisung wird nicht als gültige SQL-Anweisung erkannt.

Dieser Fehler kann auftreten, wenn die Procedural Option nicht installiert ist und eine SQL-Anweisung ausgegeben wird, die diese Option erfordert (z. B. eine CREATE PROCEDURE-Anweisung). Sie können feststellen, ob die Prozeduroption installiert ist, indem Sie SQL*Plus starten. Wenn das PL/SQL-Banner nicht angezeigt wird, ist die Option nicht installiert.

Maßnahme:Korrigieren Sie die Syntax oder installieren Sie die prozedurale Option”.

Gleiches gilt für die Art der Formatierung oder das Platzieren falscher Datentypen dort, wo sie nicht hingehören:

ORA-00902 Ungültiger Datentyp

„Ursache:Der in der CREATE- oder ALTER TABLE-Anweisung eingegebene Datentyp ist nicht gültig.

Aktion:Korrigieren Sie die Syntax”.

Weitere Informationen finden Sie in der Oracle-Dokumentation.

SQL-Fehlercodes sind die häufigste Methode zum Debuggen von SQL-Abfragen. Immer wenn Sie die Datenbank abfragen und das Problem auftritt, generiert die Datenbank-Engine den SQL-Fehlercode. Diese Codes stellen den Ort des Problems in der Abfrage dar und geben Programmierern Informationen darüber, wie es behoben oder die Ursache interpretiert werden kann.

Hauptarten von Fehlern

Formatfehler

Wenn Sie beispielsweise SELECT verwenden, müssen Sie ihm eine bestimmte Reihenfolge folgen (Listen Sie die Spalten in der Tabelle auf, die unsere Schüler und ihre Noten enthalten) und dann einen Stern. Wenn Sie sich nicht an das Format halten, einen Stern und ein Komma vertauschen, erhalten Sie eine Fehlermeldung.

"Wenn es eine BEGIN TRANSACTION gibt, muss sie immer mit einer COMMIT- oder ROLLBACK-Transaktion enden."

Ein weiteres Beispiel:Nach FROM verwenden Sie Operatoren wie WHERE, die eine Bedingung erfordern. Es kann jede Bedingung sein, einschließlich Bedingungen, die Daten extrahieren, z. B. alle Schüler mit Noten unter 30. Wenn Sie dieses Feld leer lassen, erhalten Sie einen Formatfehler.

Bedienerfehler

Befehle müssen mit SQL kompatibel sein. Sie können SUM und COUNT mit WHERE einbeziehen. Andernfalls erhalten Sie eine Fehlermeldung.

Verfahrensfehler

Verfahrenscode ist der auf dem Server gespeicherte Code, den Sie mit geringfügigen Änderungen für Ihre Zwecke verwenden können.

„Eine gespeicherte Prozedur ist ein vorbereiteter SQL-Code, den Sie speichern können, sodass der Code immer wieder verwendet werden kann … Wenn Sie also eine SQL-Abfrage haben, die Sie immer wieder schreiben, speichern Sie sie als gespeicherte Prozedur, und dann rufen Sie es einfach auf, um es auszuführen.“ ( W3-Schulen )

So erstellen Sie eine gespeicherte Prozedur aus einer Tabelle namens Kunden mit all seinen Datensätzen und ausführen, haben wir den folgenden Code:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

Mit anderen Worten, Prozeduren sind wie auf einem Server gespeicherte Vorlagen, die Sie nach Bedarf übernehmen, ändern und verwenden können.

Verfahrensfehler sind mehr oder weniger übliche Fehlerarten. Der Unterschied besteht darin, dass sie sich nicht auf eine einzelne Codezeile beziehen, sondern auf die gesamte Prozedur (Vorlage), die Sie genommen und versucht haben, leicht zu ändern.

Stellen Sie sich vor, Sie haben zwei Tische, einen leeren und einen vollen. Wenden Sie den folgenden Code auf die leere Tabelle an:

INSERT to transfer data
SELECT and WHERE to choose data

Ein Beispiel für einen strategischen Fehler wäre die Verwendung von Operatoren wie IN- und NOT IN-Operatoren. Es ist verlockend, aber nicht sehr gut optimiert (die Verwendung von JOIN ist eine viel bessere strategische Wahl).

Schwere und nicht schwerwiegende Fehler

Eine Datenbank wie MySQL oder PostgreSQL speichert Daten in Tabellen, die aus Zeilen und Spalten bestehen. Datenbankabfragen sind SQL-Befehle, die der Datenbank mitteilen, was sie mit ihren Daten tun soll. Sie können so einfach sein wie das Auswählen aller Datensätze aus einer Tabelle oder komplex genug sein, um eine völlig neue Tabelle zu erstellen.

Es gibt zwei Arten von Fehlern, die bei der Verwendung dieser Befehle auftreten können:schwerwiegende und nicht schwerwiegende.

Ein schwerwiegender Fehler stoppt die Ausführung einer Anweisung, während ein nicht schwerwiegender Fehler dies nicht tut.

Ein schwerwiegender Fehler ist ein Datenbankfehler, der nicht behoben werden kann. Ein nicht schwerwiegender Fehler ist ein Problem, das auf irgendeine Weise behoben werden kann, beispielsweise durch einen Neustart des SQL Server-Dienstes oder der Instanz von SQL Server.

Eine Datenbank kann aus vielen Gründen jederzeit schwerwiegende und nicht schwerwiegende Fehler aufweisen. Manchmal, wenn Sie sich des Problems bewusst sind, ist es möglich, es ohne allzu große Schwierigkeiten zu lösen. Zu anderen Zeiten nicht so sehr.

Der häufigste Fehlertyp ist ein Syntax- oder anderes Laufzeitproblem mit dem Datenbanksystem, das auf Daten aus der SQL-Tabelle zugreift. Diese Fehler können beim Testen abgefangen werden, bevor der Code ausgeführt wird. Sie können sicherstellen, dass alles ordnungsgemäß funktioniert, wenn es gegen das Datenbanksystem ausgeführt wird.

Erstellen Sie Ihre Fehlercodes mit RAISERROR

"Es gibt eine RAISERROR-Funktion, die verwendet werden kann, um unsere benutzerdefinierten Fehlermeldungen zu generieren, was eine großartige Möglichkeit ist, verwirrende Fehlermeldungen in etwas Sinnvolleres zu übersetzen, das die Leute verstehen würden."

Die RAISERROR-Funktion ist ein SQL Server-Systembefehl, der eine Fehlermeldung auslösen kann. Sie können es verwenden, um Fehler, Warnungen oder Informationsmeldungen anzuzeigen.

Fehler können vom Programmierer oder von SQL Server selbst verursacht werden. Es ist nützlich, um Feedback zu geben, wenn etwas schief geht, aber auch, wenn etwas passieren muss, ohne die Ausführung anderer Anweisungen im Stapel zu unterbrechen.

Verwenden Sie die folgende Syntax:

RAISERROR ( [ error_number ] , [ message ], [ state ])

Sie können RAISERROR auch anwenden, um entweder die Ausführung einer Anweisung zu beenden oder um von SQL-Anweisungen generierte Fehler an eine andere Anwendung weiterzuleiten. Beispielsweise können Sie eine Fehlermeldung auslösen, die dazu führt, dass die Ausführung des aktuellen Stapels oder der aktuellen Anweisung gestoppt wird, sowie die angegebene Nachricht anzeigen.

Die häufigste Verwendung für RAISERROR besteht darin, eine Fehlermeldung zu generieren, wenn Daten bestimmte Kriterien nicht erfüllen, wie z. B. die Eingabe zu vieler Zeichen in ein Feld, das nur 50 Zeichen zulässt.

Raiserror(msg) ist nützlich für die Behandlung von Fehlern, die während der Verarbeitung auftreten, und erfordert nicht, dass die gesamte Transaktion aufgrund eines einzelnen Fehlers fehlschlägt.

Jetzt können Sie so viele eigene Fehler erstellen, wie Sie möchten. Freut euch!

Umgang mit Fehlern

Um mit Fehlern umgehen zu können, müssen wir in der Lage sein, sie zu kontrollieren und alle zugehörigen Informationen herauszufinden. Es ist für jeden Fall notwendig, der komplizierter ist, als PRINT in „Hello World“ zu vertippen.

Eine nützliche Methode zum Abfangen von Fehlern ist die Verwendung von TRY…CATCH. Mit diesem Tool können Sie Ihren Code in einer Umgebung platzieren, in der er untersucht und sicher gehandhabt werden kann. Dort können Sie die Daten daraus extrahieren. Entscheiden Sie, ob Sie den Fehler melden, mehr darüber erfahren oder ihn beheben möchten.

Diese SQL-Server-Sandbox geht so:

BEGIN TRY  
 	--code to try
END TRY  
BEGIN CATCH  
 	--code to run if an error occurs
--is generated in try
END CATCH

Der Code, den Sie sehen möchten, wird zwischen BEGIN TRY und END TRY platziert. Wenn Fehler passieren, wird es an die CATCH-Anweisung gesendet. Dies bietet uns viele nützliche Funktionen:

  • ERROR_NUMBER gibt die interne Nummer des Fehlers zurück
  • ERROR_STATE gibt die Informationen über die Quelle zurück
  • ERROR_SEVERITY gibt Informationen über alles zurück, von Informationsfehlern bis hin zu Fehlern, die Benutzer von DBA beheben können, usw.
  • ERROR_LINE gibt die Zeilennummer zurück, in der ein Fehler aufgetreten ist
  • ERROR_PROCEDURE gibt den Namen der gespeicherten Prozedur oder Funktion zurück
  • ERROR_MESSAGE gibt die wichtigsten Informationen zurück und das ist der Nachrichtentext des Fehlers.

Folgendes erhalten wir, wenn wir versuchen, 1 durch 0 zu teilen:

USE AdventureWorks2014
GO
-- Basic example of TRY...CATCH
 
BEGIN TRY
-- Generate a divide-by-zero error  
  SELECT
    1 / 0 AS Error;
END TRY
BEGIN CATCH
  SELECT
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_STATE() AS ErrorState,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE() AS ErrorLine,
    ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

Wie Sie sehen können, ist die TRY…CATCH-Funktion sehr nützlich.

Zusammenfassung

Jetzt wissen Sie genau, was ein SQL-Fehlercode ist, welche Arten von Fehlern es gibt, warum sie auftreten, wie sie in einer Sandbox erfasst und untersucht werden, wie Sie Ihre Fehlersignale erstellen usw. Sie sind weit mehr als nur darauf vorbereitet, mit Fehlern umzugehen! Wenn nicht, lassen Sie es uns wissen und wir werden in Zukunft weitere Leitfäden veröffentlichen. Viel Glück!