Dzisiaj w pracy tworząc jeden z modułów aplikacji, zaczęły dziać się dziwne rzeczy. Jakieś magiczne dane były pobierane i nijak miały się do założonego rezultatu. Z pomocą przyszedł mi Profiler.
Profiler – to genialne narzędzie dołączone do SQL Server Management Studio, które pozwala podglądać jakie zapytania zostają wysyłane do bazy danych. Jest niezastąpiony, jeśli dzieje się magia opisana powyżej.
Znajdziemy go w Tools -> SQL Server Profiler.
Gdy zostanie uruchomiona aplikacja, wystarczy zalogować się do serwera bazy danych dokładnie tak samo, jak robimy to łącząc się w Management Studio.
Kolejnym oknem będzie tworzenie nowego Trace’a. Klikamy Run, bo domyślne opcje są w zupełnie wystarczające. Teraz możemy podglądać, co takiego jest przesyłane do naszego serwera.
Z przydatnych opcji, w górnym pasku znajdziemy gumkę, która czyści całą historię i pauzę, która zatrzymuje odczyt danych.
Nie pozostaje nam nic innego jak przetestowanie działania Profilera. Puśćmy proste zapytanie do bazy danych:
SELECT 2+2
A oto nasz ślad:
Teraz coś bardziej skomplikowanego, czyli procedura składowana:
CREATE PROCEDURE TestProfilera @id int, @imie varchar(50), @nazwisko varchar(50) AS BEGIN SELECT @id, @imie, @nazwisko END
I jej wywołanie:
exec TestProfilera 1, 'Jan', 'Kowalski'
No i to, co przechwycił profiler:
W ten prosty sposób udało mi się odkryć, że aplikacja wywołuje procedurę ze złym parametrem, co skutkowało pobieraniem błędnych danych z bazy. Szybko odnalazłem błąd i zamiast tracić czas na debugowanie mogłem w spokoju pogadać z kolegami przy herbatce 🙂
Pytanie od laika – na czym polegał błąd? Jaki parametr był zły? I co w nim było złego?
Interesuję się bazami danych, jednak dzisiejsza automatyzacja czynności powoduje, że trudno jest zrozumieć istotę występujących problemów.
Błąd, o którym wspomniałem dotyczył złej wartości z datą. Aplikacja przekazywała datę w tym momencie, zamiast podanej przez użytkownika na stronie
Rozumiem, że błąd który udało się odkryć nie dotyczył procedury z przykładu?
Jeśli tak, to warto może nieco zmodyfikować artykuł. Aktualna treść sugeruje, że błąd wystepuje w wykonaniu
exec TestProfilera 1, ‚Jan’, ‚Kowalski’
dla procedury
CREATE PROCEDURE TestProfilera
@id int,
@imie varchar(50),
@nazwisko varchar(50)
AS
BEGIN
SELECT @id, @imie, @nazwisko
END