Влияют ли изменения, сделанные в таблице, созданной объединением представления и другой таблицы, на исходное представление таблицы на основе? - PullRequest
0 голосов
/ 06 января 2020

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

Ответы [ 2 ]

1 голос
/ 06 января 2020

В принципе, да, если представления построены таким образом, что базовые таблицы могут быть обновлены через представление. Например, допустим, у меня есть таблица с именем TABLE_1 и я создаю представление VIEW_1 следующим образом:

CREATE OR REPLACE VIEW VIEW_1 AS
  SELECT *
    FROM TABLE_1

Если я выполняю оператор обновления,

UPDATE VIEW_1
  SET FIELD_N = 'XYZ'
  WHERE KEY_1 = 123

Oracle достаточно яркий, чтобы передайте UPDATE до базовой таблицы, и TABLE_1 будет обновлен.

Однако представление любой сложности, скорее всего, будет содержать операции, которые делают представление не подлежащим обновлению. Допустим, у меня есть следующий VIEW_2:

CREATE OR REPLACE VIEW VIEW_2 AS
  SELECT KEY_1,
         FIELD_N,
         SUM(SOME_OTHER_FIELD) AS OTHER_SUM,
         MIN(YADDA_YADDA) AS MIN_YADDA
    FROM TABLE_1
    GROUP BY KEY_1,
             FIELD_N

, ОБНОВЛЕНИЕ этого представления завершится с ошибкой ORA-01732: data manipulation operation not legal on this view. Так что, можете ли вы обновить через представление или нет, зависит от того, какие операции выполняет представление.

db <> fiddle здесь

0 голосов
/ 06 января 2020

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

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

Это не имеет особого смысла. Как правило, вы изменяете не представления , а базовые таблицы. Вы изменяете данные в базовых таблицах , и это отражается в представлениях.

То, что вы говорите, возможно, используя вместо триггеров для представлений. Они могут изменить базовые таблицы - или что-нибудь в этом роде. Они полностью находятся под вашим контролем и на самом деле не имеют ничего общего с функциональностью Oracle (кроме Oracle, допускающей существование instead of триггеров на представлениях).

JOIN s - операции в SELECT заявления, и они не изменяют данные. Еще раз, если данные изменяются, это будет происходить через вместо триггеров, которые полностью находятся под вашим контролем.

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

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