2015-02-17 31 views
5

To pytanie wyszło z poprzedniego postu/roztworu kopalni:SQL Server dlaczego muszę odświeżyć opinii po stole zmienia

adding a field somehow effects a views results

IMO to zasługuje na swój własny post. Korzystanie z SQL Server 2008 R2.

Dlaczego muszę odświeżać widoki po dodaniu kolumny do tabeli, do której odwołuje się widok? Chociaż nie jest to bezpośrednio konieczne, aby odpowiedzieć na to pytanie/pytanie, scenariusz/zachowanie dla mojego konkretnego scenariusza jest wyjaśnione postem połączonym powyżej.

Nie jestem wielkim fanem poglądów. Bardzo rzadko tworzę je szczerze, pracuję z kodem, którego początkowo nie pisałem. Załóżmy, że masz ponad 70 wyświetleń, których początkowo nie pisałeś, dlatego nie masz pojęcia, które z nich wymagają odświeżania za każdym razem, gdy dodajesz kolumnę bazy danych. Powinienem być w stanie dodać to, co kiedykolwiek kolumna, która kiedykolwiek stawiła w dowolnym czasie bez żadnego wpływu szczerze. Jednostka biznesowa może złożyć wniosek o zmianę, która może wymagać dodania dowolnej liczby pól w dowolnym momencie.

Z pewnością jest inne podejście do tego?

+1

Widok to nie tylko zapytanie, dynamicznie reorganizuje się za każdym razem, gdy się go nazywa. Jest tworzony za pomocą schematu, kolumn itp. Istnieje wiele przypadków (takich jak ten w odnośniku, do którego się odwołujesz), w których dodanie dodatkowych kolumn do zestawu wyników może nieoczekiwanie zachowywać się. Podczas gdy ten rodzaj idzie w przeciwną stronę, niż pożądana wersja, widoki mogą być również zadeklarowane za pomocą opcji SCHEMABINDING, która zabrania zmian schematu dla ukrytych obiektów. Jednak, jak zauważono w kilku miejscach, jeśli chcesz, aby schemat wybierał nową kolumnę, musisz użyć sp_refreshview – Xedni

+0

Dziękuję za poświęcony czas. Chociaż mi się to nie podoba, ma to sens. Zdaję sobie sprawę, że widoki mają przewagę pod względem wykorzystania zasobów. To powiedziawszy, jestem całkiem pewien, że teraz lubię je jeszcze mniej. Doświadczenie użytkownika końcowego, które widziałem dzisiaj w wyniku dodania kolumny do tabeli, było uciążliwe błędne. – Mat41

+2

Widoki nie zawsze są złe. Doskonale nadają się do upraszczania złożonych zapytań, standaryzacji reguł biznesowych w zapytaniach, które mogą być udostępniane w aplikacjach lub przechowywanych procesach, umożliwiają pisanie pól do zmiany nazw lub upraszczają zapytania do baz danych podmiotów trzecich (zwłaszcza te starsze o archaicznych nazwach, takie jak AE1401 jako tabela imię i nazwisko z polami FN144 itp.), a gdy aplikacje współużytkują tabelę, jeśli podstawowe pole tabeli musi się zmienić, nazwa widoku może pozostać taka sama, nie zmuszając do zmiany wielu aplikacji. –

Odpowiedz

4

pomocą dynamicznych widoków zarządzania, aby określić, które poglądy wpłynęły przez zmianę tabeli, a następnie pętli wyników wpłynęły poglądów używać dynamicznego SQL zadzwonić sp_refreshview (https://msdn.microsoft.com/en-us/library/ms187821(v=sql.105).aspx)

Oto krótki skrypt można dostosować do zapisanego procesu, jeśli chcesz:

DECLARE @TableName VARCHAR(500) = 'dbo.Accounts' 

DECLARE @ViewsToUpdate TABLE (ViewName VARCHAR(500)) 
    INSERT @ViewsToUpdate 
     SELECT 
      Views.TABLE_SCHEMA + '.' + Views.TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES [Views] 
      INNER JOIN sys.dm_sql_referencing_entities(@TableName, 'OBJECT') DependingViews 
       ON DependingViews.referencing_schema_name = Views.TABLE_SCHEMA 
        AND DependingViews.referencing_entity_name = Views.TABLE_NAME 
     WHERE [Views].TABLE_TYPE = 'View' 

WHILE EXISTS (SELECT * FROM @ViewsToUpdate) BEGIN 
    DECLARE @ViewName VARCHAR(500) = (SELECT TOP 1 ViewName FROM @ViewsToUpdate) 
    DECLARE @Sql NVARCHAR(1000) = 'EXEC sp_refreshview ''' + @ViewName + '''' 
    EXEC sys.sp_executesql @Sql 
    DELETE @ViewsToUpdate WHERE ViewName = @ViewName 
END 
+0

Dodano przykład kodu do automatycznego odświeżania widoków związanych z wybraną tabelą –

+0

Dziękuję za poświęcony czas. Będę musiał poczekać na zatwierdzenie, aby odtworzyć problem, a następnie uruchomić/przetestować to, ale z pewnością wygląda na to dobre rozwiązanie do zamiatania wszystkich niezbędnych widoków! – Mat41

+1

Inną cechą, którą właśnie posiadam, która może być hepful, jeśli jest tak prosta, jak odniesienie do hurtowni tabeli, jest funkcja SYNONYM. To, jak sama nazwa wskazuje, tworzy alias dla tabeli, która bezpośrednio wysyła zapytanie do obiektu, który synonimizuje (czy to słowo?). Następnie, jeśli dodasz kolumnę do tego obiektu, zostanie ona automatycznie uwzględniona, ponieważ w zasadzie jest to obiekt leżący u podstaw. – Xedni