Почему SQL Server Views необходимо обновлять каждый раз в то время

В последние несколько дней я занимаюсь большим количеством бэкэндов, и когда мы работаем с центральными сценариями базы данных, я просто пишу простые старые сценарии обновления SQL и выполняю их в базе данных. Хорошо и все, но , почему нужно писать сценарии "Обновить просмотр" и выполнять их каждый раз, когда я добавляю или редактирую некоторые поля для представления.

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

Ответ 1

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

Вам не нужно запускать 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

Ответ 2

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

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

Изменить, июль 2012, со ссылкой выше. Мой смелый

SCHEMABINDING

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

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