Почему представления SQL Server необходимо время от времени обновлять

StackOverflow https://stackoverflow.com/questions/1272829

  •  13-09-2019
  •  | 
  •  

Вопрос

Почему мне нужно писать сценарии «обновить просмотр», и выполнять их каждый раз, когда я добавляю или редактирую некоторые поля в представлении?

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

Это было полезно?

Решение

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

Вам не придется бежать 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

Другие советы

Использовать С СХЕМА-СВЯЗКОЙ в определении представления, чтобы исключить необходимость каких-либо обновлений

И в сочетании с ALTER VIEW, а не конструктором

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

СХЕМА-ОБЪЕДИНЕНИЕ

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top