2009-08-13 4 views
11

Я занимаюсь довольно большим количеством бэкэнд, создавая последние несколько дней, и когда мы работаем с центральными сценариями базы данных, я просто пишу простое старое обновление SQL сценариев и выполнить их в базе данных. Ну хорошо и все, но почему нужно писать сценарии 'refresh view' и выполнять их каждый раз, когда я добавляю или редактирую некоторые поля для представления.Почему нужно периодически обновлять представления SQL Server.

SQL Server понимает, что ему необходимо обновить представление при его редактировании в причудливых окнах редактирования окон в Management Studio, поэтому почему он не может просто сказать, что это просмотр, чтобы обновиться после редактирования представления через скрипт?

ответ

9

Необходимо обновить представления, если базовые таблицы вообще меняются. Это может изменить типы данных столбцов представления или изменить их индексы. Поэтому он должен знать. В противном случае вы будете запускать запрос против него, и он быстро взорвется.

Вам не нужно запускать sp_refreshview для изменения вида. Только для изменения его базовых таблиц.

Кроме того, пожалуйста, не надоедливый счастливый веселый шар.

Редактировать: только что запустил этот код (последовательно), чтобы попытаться воспроизвести вашу проблему. Я, к сожалению, не удалось, так как он работал, как и ожидалось (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

Но это также происходит, когда у меня есть что-то вроде SELECT b. * FROM b. После добавления столбцов в b представление пытается отобразить старые столбцы, даже если они не жестко закодированы. –

+0

Замечания Эрика все еще сохраняются. Метаданные для представления необходимо обновлять всякий раз, когда изменяется схема для базовых таблиц, даже если код для представления в противном случае оставался бы правильным. – TimothyAWiseman

3

Использование WITH SCHEMABINDING в определении представления, чтобы устранить необходимость в каких-либо освежает

А в сочетании с ALTER VIEW, не дизайнер

Редактировать, июль 2012 г., по ссылке выше. Мой смелый

SCHEMABINDING

Связывает вид на схеме базовой таблицы или таблиц. Если указано SCHEMABINDING, базовая таблица или таблицы не может быть изменена таким образом, чтобы это повлияло на определение вида. Само определение определения сначала должно быть изменено или удалено для удаления зависимостей от таблицы, которая должна быть изменена. Когда вы используете SCHEMABINDING, select_statement должен включать имена двух частей (schema.object) таблиц, представлений или определенных пользователем функций, на которые ссылаются. Все объекты, на которые ссылаются, должны находиться в одной базе данных.

Представления или таблицы, которые участвуют в представлении, созданном с помощью инструкции SCHEMABINDING , не могут быть отброшены, если это представление не было отброшено или изменено, так что у него больше нет привязки схемы. В противном случае модуль Database Engine вызывает ошибку. Кроме того, выполнение команд ALTER TABLE для таблиц, участвующих в представлениях с привязкой схемы,, когда эти утверждения влияют на определение представления.

+3

Я колебался, чтобы предложить это. 'WITH SCHEMABINDING' * только * работает, если все таблицы находятся в одной базе данных на том же сервере. – Eric

+1

Использование с schemabinding устраняет необходимость в любых обновлениях, поскольку предотвращает изменение базовых таблиц.Лучшее, что можно было бы сделать, если вам нужно изменить базовые таблицы, - дать вам напоминание о необходимости обновить представление после того, как вы удалите с помощью schemabinding, чтобы внести изменения. – TimothyAWiseman

+1

Я не вижу, как предотвращение изменений вообще эквивалентно устранению необходимости обновления? Если я не ошибаюсь, что с помощью SCHEMABINDING будет предотвращено изменение базовых таблиц? – ErikE

Смежные вопросы