Поделиться через


Изменение данных через представление

Данные, содержащиеся в базовой таблице, могут быть изменены через представление таким же образом, как и при изменении данных в самой таблице, то есть инструкциями UPDATE, INSERT и DELETE или с помощью программы bcp и инструкции BULK INSERT. Однако на изменение данных через представления налагаются следующие ограничения.

ms180800.note(ru-ru,SQL.90).gifПримечание.
Некоторые из этих ограничений не применяются к секционированным представлениям, и ни одно из них не применяется к изменениям, выполняемым триггерами типа INSTEAD OF. Дополнительные сведения см. в статье «Другие методы изменения данных через представление» ниже в этом разделе.
  • Любые изменения, в том числе инструкции UPDATE, INSERT и DELETE, должны ссылаться на столбцы только одной базовой таблицы.
  • Изменяемые в представлении столбцы должны непосредственно ссылаться на данные в столбцах базовой таблицы. Они не могут быть получены другим способом, то есть:
    • статистическими функциями (AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR или VARP);
    • вычислением. Столбец не может вычисляться на основе других столбцов. Столбцы, полученные при помощи операторов UNION, UNION ALL, CROSSJOIN, EXCEPT и INTERSECT, также основаны на вычислениях и поэтому недоступны для изменения.
  • Изменяемые столбцы не могут указываться в предложениях GROUP BY, HAVING и DISTINCT.
  • Предложение TOP не может использоваться в выражении select_statement представления, если указано предложение WITH CHECK OPTION.

Вышеназванные ограничения относятся ко всем подзапросам представления в предложении FROM, равно как и к самому представлению. В общем случае Microsoft SQL Server 2005 должен иметь возможность по определению представления однозначно отследить изменяемое значение в базовой таблице. Например, следующее представление является неизменяемым:

CREATE VIEW TotalSalesContacts
AS
SELECT C.LastName, 
SUM(O.TotalDue) AS TotalSales
FROM Sales.SalesOrderHeader O, Person.Contact C
WHERE C.ContactID = O.ContactID
GROUP BY LastName

Изменение столбца LastName в таблице TotalSalesContacts будет неприемлемо, так как на этот столбец указывает предложение GROUP BY. Если существует более одного экземпляра одной и той же фамилии, SQL Server не будет знать, которую из них следует обновить, вставить или удалить. Аналогичным образом, попытка изменить столбец TotalSales в таблице TotalSalesContacts возвратит ошибку, так как столбец является производным статистической функции. SQL Server не может связать напрямую данный столбец со столбцом базовой таблицы SalesOrderHeader.

Применяются следующие дополнительные рекомендации.

  • Все инструкции изменения данных, выполняемые для представления, должны придерживаться перечня критериев, указанных в инструкции SELECT, определяющей представление, если при этом использовано предложение WITH CHECK OPTION. При указании этого предложения строки не могут быть изменены способом, который приводит к их исчезновению из представления. Любое изменение, которое может к этому привести, отменяется, и выдается ошибка.
  • Инструкция INSERT должна указывать значения для всех столбцов базовой таблицы, которые не допускают значений NULL и не определены с ключевым словом DEFAULT.
  • Данные, изменившиеся в столбцах базовой таблицы, должны соответствовать требованиям, налагаемым на эти столбцы (возможность содержать значение NULL, ограничения, определения DEFAULT и т. д.). Например, для успешного удаления строки это удаление должно удовлетворять условиям всех ограничений FOREIGN KEY в связанных таблицах.
  • Распределенное секционированное представление (удаленное представление) не может быть изменено при использовании курсора, управляемого набором ключей. Это ограничение может быть разрешено объявлением курсора для базовой таблицы, а не для представления.
  • Массовый импорт данных в секционированное представление не поддерживается программой bcp или инструкциями BULK INSERT и INSERT ... SELECT * FROM OPENROWSET(BULK...) не поддерживают массовый импорт в секционированное представление. Однако можно вставить в секционированное представление несколько строк с помощью инструкции INSERT. Дополнительные сведения см. в разделе Массовый экспорт данных из представления или массовый импорт данных в него.
  • Инструкции READTEXT и WRITETEXT не могут применяться к столбцам представления типа text, ntext или image.

Другие методы изменения данных через представление

Если описанные выше ограничения не позволяют изменить данные через представление напрямую, рассмотрите следующие варианты.

Добавление данных через представление

Изменение данных через представление

Удаление данных через представление

См. также

Основные понятия

Изменение представлений

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

17 ноября 2008 г.

Изменения
  • Добавлено ограничение массового импорта для секционированных представлений.

5 декабря 2005 г.

Изменения
  • Включено дополнительное пояснение о том, что представление не может быть обновлено, если в выражении select_statement представления используется предложение TOP вместе с предложением WITH CHECK OPTION.