Является ли представление в базе данных обновляемым? - PullRequest
14 голосов
/ 23 сентября 2010

Можете ли вы обновить представление в базе данных? Если так, то как? Если нет, то почему нет?

Ответы [ 12 ]

17 голосов
/ 23 сентября 2010

Фактический ответ - «это зависит», абсолютов нет.

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

Однако его также можно обмануть ... в MS SQL Server и Oracle (для примера всего два) у вас могут быть триггеры, которые срабатывают при попытке вставить или обновить представление так, что вы можете сделать что-то, чего не делает сервер не думайте, что можно обновлять что-то, что обычно - потому что вы знаете, что сервер не может легко вывести из схемы.

4 голосов
/ 23 сентября 2010

Правильный ответ "это зависит".Вы не можете обновить статистический столбец в представлении, например.Для представлений Oracle вы можете использовать Google для «обновляемого представления объединения», где приведены примеры, когда вы можете и не можете обновить представление.

3 голосов
/ 30 июня 2016

Да, они обновляемые, но не всегда. Представления могут быть обновлены в следующих случаях:

  • Если представление состоит из первичного ключа таблицы, на основе которой было создано представление.

  • Если представление определено на основе одной и только одной таблицы.

  • Если представление не было определено с использованием групп и агрегатных функций.
  • Если представление не имеет какого-либо отдельного предложения в своем определении.
  • Если представление, которое предполагается обновить, основано на другом представлении, последнее должно быть обновляемым.
  • Если в определении представления нет подзапросов.
3 голосов
/ 23 сентября 2010

В прошлом не было возможности обновить какие-либо виды. Основная цель представления - просмотр данных, отсюда и название. Его также можно было бы назвать хранимым запросом .

Сегодня многие движки баз данных поддерживают обновление представлений. Это связано с ограничениями, некоторые обновления практически невозможны (например, вычисляемые столбцы, группировка и т. Д.).

3 голосов
/ 23 сентября 2010

PostgreSQL имеет ПРАВИЛА для создания обновляемых VIEW. Проверьте примеры в руководстве , чтобы узнать, как их использовать.

Ps. В PostgreSQL VIEW - это правило, правило выбора.

2 голосов
/ 23 сентября 2010

Есть два подхода:

  1. Триггер INSTEAD OF, который в основном переносит проблему на пользователя. Вы пишете некоторый процедурный код, который делает эту работу. Разумеется, никаких гарантий относительно корректности, согласованности и т. Д. С точки зрения движка СУБД не возникает, и триггер, который удаляет все из базовых таблиц, независимо от того, какое обновление сделано в представлении, вполне подойдет.

  2. Гораздо более амбициозным является просмотр обновлений, обрабатываемых исключительно движком СУБД. Здесь не так много прогресса: мягко говоря, если у вас есть какие-то хорошие идеи, вы можете развернуть кандидатскую диссертацию. На практике ваша любимая СУБД может позволять некоторые ограничивающие обновления просмотра рекламного объявления; проверьте руководство :-)

1 голос
/ 11 июля 2015

При создании представления в SQL Server метаданные для столбцов ссылочной таблицы (имя столбца и порядковый номер) сохраняются в базе данных.Любые изменения в ссылочной базовой таблице (таблицах) (переупорядочение столбцов, добавление новых столбцов и т. Д.) Не будут отражены в представлении до тех пор, пока представление не будет либо:

• Изменено с помощью инструкции ALTER VIEW • Повторно созданос операторами DROP VIEW / CREATE VIEW • Обновляется с помощью системной хранимой процедуры sp_refreshview

1 голос
/ 23 сентября 2010

http://msdn.microsoft.com/en-us/library/ms187956.aspx

См. Примечания \ обновляемый вид

1 голос
/ 23 сентября 2010

Да, вы можете, но посмотрите на СОЗДАТЬ ВИД (Transact-SQL) и посмотрите раздел Обновляемые представления

1 голос
/ 23 сентября 2010

Да, они есть - синтаксис такой же, как при обновлении таблицы

Update MyView
Set Col1 = "Testing"
Where Col2 = 3
Go

Существует несколько условий для создания представления, которое можно обновить. Их можно найти здесь

EDIT:

Я должен добавить, что основан на MS SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...