Можем ли мы написать обновление и удалить запросы в представлениях? - PullRequest
9 голосов
/ 27 июня 2010

В SQL Server 2005 у меня есть некоторые представления, созданные с помощью оператора SELECT.Можем ли мы написать UPDATE и DELETE операторов в представлениях?

Ответы [ 7 ]

18 голосов
/ 27 июня 2010

из этой статьи MSDN: Изменение данных с помощью представления ,

  • Любые модификации, включая операторы 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.

исм. статью для оставшихся ...

12 голосов
/ 27 июня 2010

Ну, вы можете удалить из представления, если это то, что вы просите, но у вас не может быть представления, которое удаляет информацию. Представление - это часть данных из базовых таблиц. При наличии разрешений вы можете выполнять те же операции с данными в представлениях, что и с таблицей напрямую.

Так что вы можете сделать что-то вроде:

DELETE FROM my_View WHERE id = 3;

Когда использовать представления
Что такое вид

3 голосов
/ 17 января 2012

Что если я сделаю следующее

Create view table1_View 
as 
   select * 
   from table1 

go 

delete 
from table1_view

Я проверил, и эта команда удаляет все данные из таблицы1

2 голосов
/ 07 июля 2014

**

Использование представлений для обновления данных:

** Представление может использоваться в запросе, который обновляет данные, с учетом нескольких ограничений. Имейте в виду, что представление не является таблицей и не содержит данных - фактическое изменение всегда происходит на уровне таблицы. Представления не могут использоваться в качестве механизма для переопределения любых ограничений, правил или ссылочной целостности, определенных в базовых таблицах.

Ограничения на обновление данных через представления Вы можете вставлять, обновлять и удалять строки в представлении с учетом следующих ограничений:

Если представление содержит объединения между несколькими таблицами, вы можете вставить и обновить только одну таблицу в представлении, а также удалить строки.

Вы не можете напрямую изменять данные в представлениях на основе запросов объединения. Вы не можете изменять данные в представлениях, которые используют операторы GROUP BY или DISTINCT.

На все изменяемые столбцы распространяются те же ограничения, как если бы операторы выполнялись непосредственно по отношению к базовой таблице.

Текстовые и графические столбцы нельзя изменить с помощью представлений.

Нет проверки критериев просмотра. Например, если представление выбирает всех клиентов, которые живут в Париже, и данные изменяются либо для добавления, либо для редактирования строки, у которой нет City = 'Paris', данные будут изменены в базовой таблице, но не показаны в представлении , если WITH CHECK OPTION не используется при определении представления. Для получения дополнительной информации проверьте это Артикул

1 голос
/ 27 ноября 2016

Более подробное объяснение ответа Сриниваса в отношении ..

Любые изменения, включая операторы UPDATE, INSERT и DELETE, должны ссылаться на столбцы только из одной базовой таблицы.

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

Предположим, вы создали следующее представление:

CREATE VIEW AuthorsNames

AS

SELECT au_id, au_fname, au_lname

FROM authors 

Возможно, вы захотите вставить данные встолбцы не видны в представлении.Для этого создайте триггер INSTEAD OF в представлении для обработки вставок.

CREATE TRIGGER ShowInsert on AuthorsNames

INSTEAD OF INSERT

AS

BEGIN

INSERT INTO authors

   SELECT address, au_fname, au_id, au_lname, city, contract, phone, state, zip

   FROM inserted

END

Используя этот метод, вы можете вставлять в несколько таблиц, но это становится более сложным, если вы имеете дело с большим количеством базовых таблиц. Ссылка MSDN

1 голос
/ 27 июня 2010

В дополнение к ограниченному обновлению, разрешенному для самого представления, вы можете использовать триггер INSTEAD OF для выполнения гораздо более сложных изменений.INSTEAD OF в основном позволяет вам перехватить обновление или удалить и выполнить практически любое изменение.Список литературы: MSDN Статья .

0 голосов
/ 19 августа 2013

Ответ лежит, если представление является ОБНОВЛЯЕМЫМ или НЕ ОБНОВЛЯЕМЫМ.

Обновляемое представление - это представление, которое содержит все ненулевые столбцы из базовой таблицы.

Если это так, ваш запрос на обновление, удаление и вставку в представлении влияет на данные в базовой реальной таблице.

Вот так .....

...