Database
 sql >> Baza danych >  >> RDS >> Database

Jak czytać i interpretować błędy SQL

Kody błędów w SQL są generowane przez serwer w celu dostarczenia informacji o tym, co poszło nie tak. Mają one różne znaczenie w zależności od używanej wersji SQL, ale zwykle wskazują na niemożność wykonania żądanej operacji.

Najłatwiejszym sposobem jego poznania jest najprostszy język programowania o nazwie BASIC i jego programy, takie jak „Hello world”. Wpisz w interfejsie:

PRINT "Hello, World!"

Jeśli wpiszesz PRINT jako PRRRR, otrzymasz komunikat o błędzie (odpowiednikiem w prawdziwym życiu byłby ktoś, kto każe ci jechać prawą stroną drogi, np. przestrzegając przepisów).

To stosunkowo proste, jeśli chodzi o proste operacje, ale co z bardziej złożonymi systemami? Zamieszczamy tutaj również przykłady kodu SQL. Miłej zabawy!

Poniższy kod importuje niezbędne funkcje z biblioteki standardowej, a następnie tworzy konsolę, pobiera wskaźnik do swojego standardowego strumienia wyjściowego, drukuje komunikat w tym strumieniu i zwalnia używane obiekty:

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

Jeśli popełnisz błąd w tym kodzie, znalezienie go zajmie trochę czasu, zwłaszcza jeśli masz 500 stron takiego kodu. Tak więc komputer znajdzie błędy i wskaże, gdzie się znajdują.

Do czego służą kody błędów SQL i jak działają?

Przydatność kodów błędów SQL polega na tym, że oprogramowanie znajduje Twój kod i wskazuje na niego (przykład). Nie musisz samodzielnie sprawdzać tysięcy linii kodu. Wyobraź sobie, że dostajesz tylko jeden kod błędu („Powodzenia następnym razem, przegrany!” lub „Kto nauczył cię kodować, koń?”) i musisz ponownie przejrzeć cały projekt!

W pewnym sensie kody błędów są doskonałymi małymi pomocnikami Świętego Mikołaja:jasne, przydatne i oszczędzające mnóstwo czasu. Musisz je tylko poznać.

Bazy danych, począwszy od poziomu podstawowego, są zbiorami informacji zebranych i sklasyfikowanych. Interesuje nas typ relacyjnych baz danych, co oznacza, że ​​istnieją relacje między komórkami, w których przechowywane są dane.

Na przykład możesz mieć całą grupę studentów na uniwersytecie i chcieć nagrodzić nagrodą każdego, kto zdał ponad 90% na egzaminach. Możesz ręcznie wpisać ich imiona, płeć, adresy, numery kont bankowych (wszystkie są powiązane, stąd relacyjne bazy danych), oceny, a następnie ręcznie wybrać te z wysokimi wynikami.

Archaiczny? Tak, ale zdziwiłbyś się, gdy dowiedziałbyś się, ile firm nadal prowadzi działalność w ten sposób w XXI wieku. Ukończenie operacji, które zajęłoby komputerowi kilka sekund, może zająć miesiące. Zwłaszcza jeśli mówimy o setkach lub tysiącach uczniów.

Teraz, umieszczając wszystkich tych uczniów w bazie danych, możesz używać języka takiego jak SQL:

SELECT * FROM Student WHERE Percentage>=90;

Zrobione! Problemy zaczynają się jednak, gdy piszesz swój kod.

Zrozumiałe, że staje się to bardzo złożone, więc im więcej piszesz, tym większe są szanse, że Twój kod zawiera błędy. Tutaj najbardziej przydatne będą kody błędów. Kiedy widzimy kody błędów, powinniśmy być wdzięczni (co nie powstrzymuje nas przed przeklinaniem za każdym razem). Wykonują za Ciebie całą robotę, a wszystko, co musisz zrobić, to udać się do źródła i rozwiązać problem.

Podaj mi kilka szczegółów!

Gdy baza danych nie daje oczekiwanych wyników, zgłaszany jest kod błędu. Pomaga zidentyfikować problem i jak go naprawić. Kody błędów SQL, takie jak te poniżej, będą przydatne podczas rozwiązywania problemów z bazami danych:

Komunikaty o błędach bazy danych Oracle9i

Wydanie 2 (9.2)

ORA-00904:„określona liczba wierszy przekracza maksimum”.

ORA-00900:„niewystarczające uprawnienia w obiekcie”.

ORA-00900:„nieprawidłowa instrukcja SQL”.

ORA-00902:„nieprawidłowy typ danych”.

W SQL mamy wiele różnych rodzajów błędów. Ale jeśli nie zamierzasz ich oprawić i powiesić na ścianie, musisz wiedzieć, jak sobie z nimi radzić. Dobrą rzeczą jest to, że błędy SQL zawierają link do dokładnej lokalizacji błędu w kodzie, a także dostarczają informacji o tym, co jest nie tak.

Zacznijmy od najprostszego przykładu błędu:

ORA-00900:„nieprawidłowa instrukcja SQL”.

Jak zapewne zgadłeś, polecenie musisz poprawnie napisać. Może być literówka lub przecinek w miejscu, do którego nie należy. Lub, w zależności od przypadku, może być konieczne zainstalowanie dodatkowego oprogramowania:

„Oświadczenie nie zostało rozpoznane jako prawidłowe wyrażenie SQL.

Ten błąd może wystąpić, jeśli opcja proceduralna nie jest zainstalowana i zostanie wydana instrukcja SQL wymagająca tej opcji (na przykład instrukcja CREATE PROCEDURE). Możesz określić, czy opcja proceduralna jest zainstalowana, uruchamiając SQL*Plus. Jeśli baner PL/SQL nie jest wyświetlany, opcja nie jest zainstalowana.

Działanie:popraw składnię lub zainstaluj opcję proceduralną”.

To samo dotyczy rodzaju formatowania lub umieszczania niewłaściwych typów danych tam, gdzie ich nie ma:

ORA-00902 nieprawidłowy typ danych

„Przyczyna:typ danych wprowadzony w instrukcji CREATE lub ALTER TABLE jest nieprawidłowy.

Działanie:popraw składnię”.

Więcej informacji znajdziesz w dokumentacji Oracle.

Kody błędów SQL są najczęstszym sposobem debugowania zapytań SQL. Za każdym razem, gdy wysyłasz zapytanie do bazy danych i pojawia się problem, aparat bazy danych generuje kod błędu SQL. Kody te reprezentują lokalizację problemu w zapytaniu i dają programistom informacje o tym, jak go naprawić lub jak zinterpretować, co go spowodowało.

Główne rodzaje błędów

Błędy formatu

Na przykład, gdy używasz SELECT, musisz wykonać po nim określoną sekwencję (wymienić kolumny w tabeli, która zawiera naszych uczniów i ich oceny), a następnie gwiazdkę. Jeśli nie zastosujesz się do formatu, zamień gwiazdkę i przecinek, otrzymasz komunikat o błędzie.

„jeśli jest BEGIN TRANSACTION, zawsze musi się ona kończyć transakcją COMMIT lub ROLLBACK”.

Inny przykład:po FROM używasz operatorów takich jak WHERE, który wymaga warunku. Może to być dowolny warunek, w tym warunki, które wyodrębniają dane, np. wszyscy uczniowie z ocenami poniżej 30. Jeśli pozostawisz to pole puste, pojawi się błąd formatu.

Błąd operatora

Polecenia muszą być zgodne z SQL. Możesz dodać SUM i COUNT z WHERE. W przeciwnym razie pojawi się błąd.

Błędy proceduralne

Kod proceduralny to kod przechowywany na serwerze, którego możesz używać do swoich celów z drobnymi zmianami.

„Procedura składowana to przygotowany kod SQL, który można zapisać, dzięki czemu kod może być wielokrotnie używany… Więc jeśli masz zapytanie SQL, które piszesz w kółko, zapisz je jako procedurę składowaną, a potem po prostu zadzwoń, aby to wykonać. ( Szkoły W3 )

Aby utworzyć procedurę składowaną z tabeli o nazwie Klienci ze wszystkimi jego rekordami i wykonać go, mamy następujący kod:

CREATE PROCEDURE SelectAllCustomers
AS
SELECT * FROM Customers
GO;

EXEC SelectAllCustomers;

Innymi słowy, procedury są jak szablony przechowywane na serwerze, które można pobierać, poprawiać i używać w razie potrzeby.

Błędy proceduralne to mniej lub bardziej powszechne rodzaje błędów. Różnica polega na tym, że odnoszą się nie do pojedynczej linii kodu, ale do całej procedury (szablonu), którą wziąłeś i próbowałeś nieznacznie zmienić.

Wyobraź sobie, że masz dwa stoliki, jeden pusty, a drugi pełny. Zastosuj poniższy kod do pustej tabeli:

INSERT to transfer data
SELECT and WHERE to choose data

Przykładem błędu strategicznego byłoby użycie operatorów takich jak operatory IN i NOT IN. Jest kusząca, ale niezbyt dobrze zoptymalizowana (używanie JOIN jest znacznie lepszym wyborem strategicznym).

Błędy krytyczne i niekrytyczne

Baza danych, taka jak MySQL lub PostgreSQL, przechowuje dane w tabelach, które składają się z wierszy i kolumn. Zapytania do bazy danych to polecenia SQL, które informują bazę danych, co ma zrobić z jej danymi. Mogą być tak proste, jak wybranie wszystkich rekordów z tabeli, lub na tyle złożone, aby utworzyć całkowicie nową tabelę.

Istnieją dwa rodzaje błędów, które mogą wystąpić podczas korzystania z tych poleceń:krytyczny i niekrytyczny.

Błąd krytyczny zatrzymuje wykonanie instrukcji, podczas gdy błąd niekrytyczny nie.

Błąd krytyczny to błąd bazy danych, którego nie można naprawić. Błąd niekrytyczny to problem, który można rozwiązać w pewien sposób, na przykład przez ponowne uruchomienie usługi SQL Server lub instancji SQL Server.

Baza danych może zawierać zarówno błędy krytyczne, jak i niekrytyczne w dowolnym momencie z wielu powodów. Czasami, jeśli jesteś świadomy problemu, można go rozwiązać bez większych trudności. Innym razem nie tak bardzo.

Najczęstszym rodzajem błędu jest błąd składni lub inny problem w czasie wykonywania z systemem bazy danych, który uzyskuje dostęp do danych z tabeli SQL. Te błędy mogą zostać wyłapane podczas testowania przed uruchomieniem kodu. Możesz upewnić się, że wszystko działa poprawnie, gdy jest wykonywane w systemie bazy danych.

Tworzenie kodów błędów za pomocą RAISERROR

„Istnieje funkcja RAISERROR, której można użyć do generowania naszych niestandardowych komunikatów o błędach, co jest świetnym sposobem na przetłumaczenie mylących komunikatów o błędach na coś bardziej znaczącego, co ludzie zrozumieją”.

Funkcja RAISERROR to polecenie systemowe serwera SQL, które może zgłosić komunikat o błędzie. Możesz go użyć do wskazania błędów, ostrzeżeń lub komunikatów informacyjnych.

Błędy mogą być spowodowane przez programistę lub przez sam SQL Server. Jest to przydatne do przekazywania informacji zwrotnych, gdy coś pójdzie nie tak, ale także wtedy, gdy coś musi się wydarzyć bez przerywania wykonywania innych instrukcji w partii.

Użyj następującej składni:

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

Możesz również zastosować RAISERROR, aby przerwać wykonywanie instrukcji lub przekazać błędy wygenerowane przez instrukcje SQL do innej aplikacji. Na przykład możesz zgłosić komunikat o błędzie, który spowoduje zatrzymanie wykonywania bieżącej partii lub instrukcji, a także wyświetlenie określonego komunikatu.

Najczęstszym zastosowaniem RAISERROR jest generowanie komunikatu o błędzie, gdy dane nie spełniają pewnych kryteriów, na przykład wpisanie zbyt wielu znaków w polu, które może zawierać tylko 50 znaków.

Raiserror(msg) jest przydatny do obsługi błędów występujących podczas przetwarzania i nie wymaga niepowodzenia całej transakcji z powodu pojedynczego błędu.

Teraz możesz stworzyć tyle własnych błędów, ile chcesz. Raduj się!

Radzenie sobie z błędami

Aby poradzić sobie z błędami, musimy być w stanie je kontrolować i znaleźć wszystkie powiązane informacje. Jest to konieczne w każdym przypadku, który jest bardziej skomplikowany niż błędne wpisanie PRINT w „Hello World”.

Jednym z przydatnych sposobów wyłapywania błędów jest użycie TRY…CATCH. To narzędzie pozwala zabrać kod i umieścić go w środowisku, w którym można go bezpiecznie zbadać i obsługiwać. Tam możesz wyodrębnić z niego dane. Zdecyduj, czy chcesz zgłosić błąd, dowiedzieć się o nim więcej, czy go naprawić.

Ta piaskownica serwera SQL wygląda następująco:

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

Kod, który chcesz obejrzeć, jest umieszczony między BEGIN TRY i END TRY. Jeśli wystąpią błędy, zostanie wysłany do instrukcji CATCH. Zapewnia nam to wiele przydatnych funkcji:

  • ERROR_NUMBER zwraca wewnętrzny numer błędu
  • ERROR_STATE zwraca informacje o źródle
  • ERROR_SEVERITY zwraca informacje o wszystkim, od błędów informacyjnych po błędy, które użytkownicy DBA mogą naprawić itp.
  • ERROR_LINE zwraca numer linii, w której wystąpił błąd
  • ERROR_PROCEDURE zwraca nazwę procedury lub funkcji składowanej
  • ERROR_MESSAGE zwraca najważniejsze informacje, czyli tekst komunikatu o błędzie.

Oto, co otrzymujemy, gdy próbujemy podzielić 1 przez 0:

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

Jak widać, funkcja TRY…CATCH jest bardzo przydatna.

Podsumowanie

Teraz wiesz dokładnie, czym jest kod błędu SQL, jakie są rodzaje błędów, dlaczego się zdarzają, w jaki sposób są piaskowane i badane, jak tworzyć sygnały błędów itp. Jesteś znacznie więcej niż tylko przygotowany do radzenia sobie z błędami! Jeśli nie, daj nam znać, a w przyszłości opublikujemy więcej poradników. Powodzenia!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 19 zasobów online do nauki o błędach projektowania bazy danych

  2. Kilka drobnych problemów z próbkami Hekaton

  3. Ponieważ musisz znać PowerShell

  4. Ustawianie fizycznej gotowości Active Data Guard w architekturze RAC One Node — część 1

  5. Jak zainstalować InfluxDB na Ubuntu 20.10