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

Slawomir Drzymala

Still playing with data and .NET technologies
Slawomir Drzymala
Follow me on

3 Comments

  1. Piotr Ziuziański

    Bardzo przydatna procedurka 🙂

    Reply
  2. Gość

    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.

    Reply
    1. Adrian ChodkowskiAdrian Chodkowski

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

      Reply

Leave a Comment

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