ORA-22816 при обновлении Joined View вместо триггера

Я много читал об этом, но не нашел в этом никакой помощи.

Моя ситуация: у меня есть две таблицы базы данных, которые принадлежат друг другу. Эти таблицы я хочу запросить с EntityFramework. Поскольку таблица B содержит для EntityFramework дискриминатор (для выбора правильного класса для таблицы A), я создал представление, объединяющее таблицу A и таблицу B.

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

Поэтому я попытался создать триггер "Вместо", чтобы просто обновить / вставить таблицу A (поскольку таблица B не имеет значения и никогда не будет обновляться).

Когда я создал триггер - все нормально. Если я вставляю что-то с оператором SQL - все хорошо. Но: если я вставляю напрямую в представление (используя Oracle SQL Developer), оно выдает исключение, как показано ниже:

ORA-22816 (неподдерживаемая функция с предложением RETURNING).

Если я делаю то же самое с EntityFramework, я получаю ту же ошибку. Кто-нибудь может мне помочь?

Ниже моего кода:

Таблица A и Таблица B:

CREATE Table "TableA" 
(
 "ID" Number NOT NULL,
 "OTHER_VALUESA" varchar2(255),
 "TableB_ID" number not null,
 CONSTRAINT PK_TableA PRIMARY KEY (ID)
);

CREATE Table "TableB" 
(
 "ID" Number NOT NULL,
 "NAME" varchar2(255),
 "DISCRIMINATOR" varchar2(255),
 CONSTRAINT PK_TableB PRIMARY KEY (ID)
);

Объединенный вид:

Create or Replace View "JoinTableAandB"
( 
  "ID",
  "OTHER_VALUESA",
  "TableB_ID",
  "DISCRIMINATOR"
) AS
select tableA.ID, tableA.OTHER_VALUESA, tableA.TableB_ID, tableB.DISCRIMINATOR
from TABLEA tableA
inner join TABLEB tableB on tableA.TableB_ID = tableB.ID;

И, наконец, триггер:

create or replace TRIGGER "JoinTableAandB_TRG"
INSTEAD OF INSERT ON "JoinTableAandB"
FOR EACH ROW
BEGIN 
insert into TABLEA(OTHER_VALUESA, TABLEB_ID)
values (:NEW.OTHER_VALUESA, :NEW.TABLEB_ID);
END;

Я также попробовал (проверить правильность вставки, просто введя "NULL" в триггер вместо вставки. Но получил то же сообщение об ошибке.

Кто-нибудь знает, как это решить? Или у кого-нибудь есть хорошая альтернатива (лучшая идея)?

Спасибо!

Примечание. Я также определил последовательность для идентификатора Table A, чтобы он генерировался автоматически.

// Редактировать: я нашел возможное решение для MS SQL:

/questions/8007027/entity-framework-prosmotr-i-vstavka-vmesto-triggera-nevozmozhno-vstavit-stroku-v-predstavlenie/8007037#8007037

Но я не знаю, как перевести это в Oracle... Как я могу вернуть что-то из триггера?

1 ответ

Решение

Примечание. Я также определил последовательность для идентификатора TableA, чтобы он генерировался автоматически.

В EF StoreGenerated ключи в Oracle несовместимы с триггерами INSTEAD OF. EF использует предложение RETURNING для вывода сгенерированных хранилищем ключей, что не работает с триггерами INSTEAD OF.

Другие вопросы по тегам