В Oracle возможно ли вставить или обновить запись через представление? - PullRequest
31 голосов
/ 31 октября 2009

В Oracle возможно ли ВСТАВИТЬ или ОБНОВИТЬ запись (строку) через представление?

Ответы [ 4 ]

42 голосов
/ 31 октября 2009

Представления в Oracle могут обновляться при определенных условиях. Это может быть сложно, и обычно не рекомендуется.

Из справочника по SQL 10g Oracle :

Примечания по обновляемым представлениям

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

Чтобы узнать, можно ли и каким образом изменять столбцы изначально обновляемого представления, запросите представление словаря данных USER_UPDATABLE_COLUMNS. Информация, отображаемая этим представлением, имеет смысл только для изначально обновляемых представлений. Для того чтобы представление было по своей природе обновляемым, должны быть выполнены следующие условия:

  • Каждый столбец в представлении должен соответствовать столбцу одной таблицы. Например, если столбец представления сопоставляется с выводом предложения TABLE (неопознанная коллекция), то представление не может быть обновлено по своей природе.
  • Представление не должно содержать одну из следующих конструкций:
    • Оператор множества
    • оператор DISTINCT
    • Совокупная или аналитическая функция
    • Предложение GROUP BY, ORDER BY, MODEL, CONNECT BY или START WITH
    • Выражение коллекции в списке SELECT
    • Подзапрос в списке SELECT
    • Подзапрос, обозначенный ТОЛЬКО ДЛЯ ЧТЕНИЯ
    • Присоединения, за некоторыми исключениями, как описано в Руководстве администратора базы данных Oracle

Кроме того, если внутренне обновляемое представление содержит псевдоколонки или выражения, вы не можете обновить строки базовой таблицы с помощью инструкции UPDATE, которая ссылается на любой из этих псевдоколонок или выражений.

Если вы хотите, чтобы представление объединения было обновляемым, то должны выполняться все следующие условия:

  • Оператор DML должен влиять только на одну таблицу, лежащую в основе объединения.
  • Для оператора INSERT представление не должно создаваться WITH CHECK OPTION, и все столбцы, в которые вставляются значения, должны происходить из таблицы с сохранением ключа. Сохраняемая ключом таблица - это таблица, для которой каждый первичный ключ или значение уникального ключа в базовой таблице также уникально в представлении соединения.
  • Для оператора UPDATE все обновленные столбцы должны быть извлечены из таблицы, сохраненной на ключе. Если представление было создано WITH CHECK OPTION, то объединение столбцов и столбцов, взятых из таблиц, на которые ссылаются более одного раза в представлении, должно быть экранировано от UPDATE.
  • Для оператора DELETE, если в результате объединения получается более одной таблицы с сохранением ключей, Oracle Database удаляет из первой таблицы, указанной в предложении FROM, независимо от того, было ли представление создано с помощью CHECK OPTION.
10 голосов
/ 31 октября 2009

В Oracle есть два способа сделать обновляемые представления: -

  1. Представление является "сохраненным ключом" относительно того, что вы пытаетесь обновить. Это означает, что первичный ключ базовой таблицы находится в представлении, а строка отображается только один раз в представлении. Это означает, что Oracle может точно определить, какую строку таблицы нужно обновить ИЛИ
  2. Вы пишете вместо триггера.

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

4 голосов
/ 31 октября 2009

Есть два раза, когда вы можете обновить запись через представление:

  1. Если представление не имеет соединений или вызовов процедур и выбирает данные из одной базовой таблицы.
  2. Если представление имеет триггер INSTEAD OF INSERT , связанный с представлением.

Как правило, вы не должны полагаться на возможность вставки в представление, если вы специально не написали для него триггер INSTEAD OF. Помните, что существуют также триггеры INSTEAD OF UPDATE, которые также могут быть записаны для помощи в обновлении.

0 голосов
/ 23 мая 2015

ДА , вы можете обновить и вставить в представление, и это изменение будет отражено в исходной таблице ....
НО
1-представление должно иметь все значения NOT NULL в таблице
2 - обновление должно иметь те же правила, что и таблица ... "обновление первичного ключа, связанного с другим внешним ключом .. и т. Д." ...

...