Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Из Oracle 10g SQL Reference:

Заметки об обновляемых представлениях

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

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

  • Каждый столбец в представлении должен отображать столбец одной таблицы. Например, если столбец представления сопоставляется с выводом предложения TABLE (неназванной коллекции), то представление не является по своей сути обновляемым.
  • В представлении не должно быть ни одной из следующих конструкций:
    • Оператор набора
    • оператор DISTINCT
    • Агрегатная или аналитическая функция
    • ГРУППА BY, ORDER BY, MODEL, CONNECT BY или START WITH clause
    • Выражение коллекции в списке SELECT
    • Подзапрос в списке SELECT
    • Подзапрос, обозначенный WITH READ ONLY
    • Объединение, за некоторыми исключениями, как описано в Руководстве администратора базы данных Oracle

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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