Обновляемое представление

Последнее обновление: 11.10.2020

Представления могут быть обновляемыми (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
Обновляемое представление в T-SQL

Стоит отметить, что при добавлении фактически будет добавлен объект в таблицу Products, которую использует представление ProductView. И поэтому надо учитывать, что если в этой таблице есть какие-либо столбцы, в которые представление не добавляет данные, но которые не допускают значение NULL или не поддерживают значение по умолчанию, то добавление завершится с ошибкой.

Обновление строки представления:

UPDATE ProductView 
SET Price= 15000 WHERE Product='Nokia 8'

Удаление строки в представлении:

DELETE FROM ProductView 
WHERE Product='Nokia 8'

Обновление и удаление также затрагивают ту таблицу, которую использует представление.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850