Widok utworzony w MS SQL Server nie pokazuje poprawnych rezultatów

Istnieje wiele artykułów i sygnałów, aby nie używać “SELECT *” w kodzie produkcyjnym. Z łatwością można znaleźć wiele z nich w internecie jak np. ten: here Okazuje się jednak, że autorzy niemal zawsze zapominają o jednym ważnym czynniku, który może spowodować, że  za używanie “SELECT *” zapłacimy najwyższą cenę, a mianowicie otrzymamy niewłaściwe rezultaty. Co gorsza serwer nie zwróci żadnego komunikatu błędu, ostrzeżenia o błędzie lub nieprawidłowości. Zobaczmy przykład.

Na początku stwórzmy prostą tabelę i wstawmy do niech przykładowe dane.

Teraz utwórzmy widok do tej tabeli używając “SELECT *”

Zobaczmy rezultaty:

Jak widać nie ma z tym żadnego problemu, a wyniki zapytania pokazują prawidłowe dane.
1

Dodajmy nowe danie i zobaczmy co się stanie.

Tym razem zarówno widok jak i zapytanie na oryginalnej tabeli zwracają dokładnie to samo.
2

Póki co wszystko działa bardzo dobrze, ale zróbmy coś ciekawszego. Dodajmy do tabeli na której stworzyliśmy widok nową kolumnę.

Po ponownym wykonaniu zapytania wynik jest następujący:
3

Jak widać rezultaty zapytań opartych na tabeli i na widoku są różne, natomiast widok po prostu nie pokazał nowej kolumny. Zróbmy jednak jeszcze coś więcej.

Po aktualizacji kolumny wynik widoku nadal jest niepoprawny.
4

Okazuje się jednak, że konsekwencje naszych działań są o wiele poważniejsze. O ile teraz po prostu nie widzimy wszystkich danych to te, które już się pojawiły są poprawne. Zobaczmy co się jednak stanie kiedy usuniemy kolumnę, która teraz się pokazuje i istniała przed utworzeniem widoku.

Wyniki są następujące:
7

SQL Server zwrócił dane z zupełnie innej kolumny. Jak widać widok działa poprawnie – to znaczy wykonuje się – i nie zwraca żadnego komunikatu natomiast dane są kompletnie niepoprawne. W produkcyjnym kodzie może to oczywiście spowodować wiele problemów począwszy od nieprawidłowych danych na raporcie, aż do przerwy w działaniu aplikacji, która korzysta z takiego widoku. Rozwiązanie jest proste – nigdy nie używaj “SELECT *”. Oczywiście istnieje kilka sytuacji kiedy “SELECT *” można użyć – zwłaszcza podczas prac developerskich – natomiast jest to zła praktyka i należy się jej wystrzegać.

Warto również wspomnieć o tym, że istnieje mechanizm, który pozwala naprawić ten błąd – wystarczy użyć procedury składowanej sp_refreshview:

Po jej wykonaniu widok został odświeżony, a otrzymywane rezultaty będą poprawne. Nie jest to jednak wytłumaczenie na wykorzystywanie niesławnego “SELECT *”, a jedynie możliwość naprawy już istniejących rozwiązań.

Slawomir Drzymala
Follow me on

3 Comments

  1. Pierwszy raz widzę takie dziwne zachowanie się widoku. To że nie wyświetla wszystkich dodanych kolumn, oraz że potrafi pokazać błędne dane, jest dla mnie wręcz szokujące.

    • A jednak zdarza się 🙂 Między innymi dlatego “nie używaj SELECT *” pojawia się praktycznie na każdej prezentacji dotyczącej dobrych praktyk.

Leave a Reply

Your email address will not be published. Required fields are marked *