Представления могут быть обновляемыми (updatable). В таких представлениях мы можем изменить или удалить строки или добавить в них новые строки.
При создании подобных представлений есть множество ограничений. В частности, команда SELECT при создании обновляемого представления не может содержать:
TOP
DISTINCT
UNION
JOIN
агрегатные функции типа COUNT или MAX
GROUP BY и HAVING
подзапросы
производные столбцы или столбцы, которые вычисляются на основании нескольких значений
обращения одновременно к нескольким таблицам
Стоит отметить, что это касается именно обновляемого представления. Например, для создания обычного представления мы можем использовать в команде SELECT оператор JOIN, однако такое представление не будет обновляемым. При попытке его обновить, мы будем получать ошибку вида "View or function название_представления is not updatable because the modification affects multiple base tables."
Допустим, у нас есть следующая таблица:
CREATE TABLE Products ( Id INT IDENTITY PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Manufacturer NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL )
И создадим обновляемое представление:
CREATE VIEW ProductView AS SELECT ProductName AS Product, Manufacturer, Price FROM Products
Добавим в него данные:
INSERT INTO ProductView (Product, Manufacturer, Price) VALUES('Nokia 8', 'HDC Global', 18000) SELECT * FROM ProductView
Стоит отметить, что при добавлении фактически будет добавлен объект в таблицу Products, которую использует представление ProductView. И поэтому надо учитывать, что если в этой таблице есть какие-либо столбцы, в которые представление не добавляет данные, но которые не допускают значение NULL или не поддерживают значение по умолчанию, то добавление завершится с ошибкой.
Обновление строки представления:
UPDATE ProductView SET Price= 15000 WHERE Product='Nokia 8'
Удаление строки в представлении:
DELETE FROM ProductView WHERE Product='Nokia 8'
Обновление и удаление также затрагивают ту таблицу, которую использует представление.