2009-08-13 14 views
11

Mam dość dużo backendu rozwijającego się w ciągu ostatnich kilku dni, a ponieważ pracujemy z centralnymi skryptami bazy danych, po prostu piszę starą starą aktualizację SQL skrypty i wykonać je w bazie danych. Dobrze, ale wszystko, ale , dlaczego trzeba pisać "odświeżać" skrypty i wykonywać je za każdym razem, gdy dodaję lub edytuję niektóre pola do widoku.Dlaczego SQL Server Widoki muszą być odświeżane co jakiś czas

SQL Server rozumie, że musi odświeżyć widok podczas edytowania go w fantazyjnych oknach-edycji w Management Studio, więc dlaczego nie może po prostu powiedzieć, że widok, aby odświeżyć się po edycji widoku przez skrypt?

Odpowiedz

9

Widoki należy odświeżać, jeśli w ogóle ulegną zmianie tabele bazowe. To może zmienić typy danych kolumn widoku lub zmienić ich indeksy. Dlatego musi wiedzieć. W przeciwnym razie wystosowałbyś kwerendę przeciwko niemu, a to szybko wybuchnie.

Nie trzeba uruchamiać sp_refreshview w celu zmiany widoku. Tylko do zmiany jego tabel podstawowych.

Proszę również nie prowokować radosnej zabawy.

Edytuj: Po prostu uruchom ten kod (jeden po drugim), aby spróbować odtworzyć problem. I był niestety w stanie, jak to działa zgodnie z oczekiwaniami (SQL Server 2008):

create view MyView 
as 
select ProductKey, ProductID, ProductName, Price 
from dbo.Products 

select v.* from MyView v 

alter view MyView 
as 
select ProductKey, ProductID, ProductName, Price*100 as MyPrice 
from dbo. Products 

select v.* from MyView v 
+1

Ale to zachowanie występuje również, gdy mam coś takiego jak SELECT b. * Z B. Po dodaniu kolumn do b, widok próbuje wyświetlić stare kolumny, mimo że nie są one na stałe. –

+0

Komentarze Erica wciąż są aktualne. Metadane widoku należy odświeżać za każdym razem, gdy zmienia się schemat dla tabel podstawowych, nawet jeśli kod widoku pozostałby poprawny. – TimothyAWiseman

3

Zastosowanie WITH SCHEMABINDING w definicji widoku do usunięcia potrzebę jakichkolwiek odświeża

A w połączeniu z ALTER VIEW, nie projektant

Edytuj, lipiec 2012, z powyższego linku. Mój śmiały

SCHEMABINDING

Wiąże widoku do schematu bazowego tabeli lub tabel. Jeśli określono SCHEMABINDING, tabela podstawowa lub tabele nie mogą być modyfikowane w sposób, który miałby wpływ na definicję widoku. Definicja widoku musi zostać najpierw zmodyfikowana lub usunięta, aby usunąć zależności z tabeli, która ma zostać zmodyfikowana. Podczas korzystania SCHEMABINDING, select_statement musi zawierać nazwy dwuczęściowe (schema.object) tabel, widoki lub funkcje zdefiniowane przez użytkownika, które są przywoływane. Wszystkie obiekty, do których istnieją odwołania, muszą znajdować się w tej samej bazie danych.

Widoki lub tabele, które uczestniczą w widoku utworzonym przy użyciu klauzuli SCHEMABINDING , nie mogą zostać usunięte, chyba że widok zostanie upuszczony lub zmieniony, tak aby nie wiązał już schematu. W przeciwnym razie aparat bazy danych zgłosi błąd. Ponadto wykonywanie instrukcji ALTER TABLE w tabelach uczestniczących w widokach, które mają powiązanie schematu, kończy się niepowodzeniem, gdy te instrukcje wpływają na definicję widoku.

+3

Zawahałem się zasugerować to. 'WITH SCHEMABINDING' * only * działa, jeśli wszystkie tabele znajdują się w tej samej bazie danych na tym samym serwerze. – Eric

+1

Używanie z wykreślaniem schematów usunęłoby potrzebę odświeżenia, ponieważ uniemożliwia zmianę tabel podstawowych.Najlepsze, co by się stało, gdybyś musiał zmienić tabele bazowe, przypomniał, że musisz później zaktualizować widok, usuwając schemat za pomocą schemirinding, aby dokonać zmiany. – TimothyAWiseman

+1

Nie widzę, jak zapobieganie zmianie w ogóle jest równoważne z usunięciem potrzeby odświeżenia? O ile się nie mylę, że ZE SCHEMABINDING uniemożliwi zmianę tabel podstawowych? – ErikE

Powiązane problemy