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:
Но я не знаю, как перевести это в Oracle... Как я могу вернуть что-то из триггера?
1 ответ
Примечание. Я также определил последовательность для идентификатора TableA, чтобы он генерировался автоматически.
В EF StoreGenerated ключи в Oracle несовместимы с триггерами INSTEAD OF. EF использует предложение RETURNING для вывода сгенерированных хранилищем ключей, что не работает с триггерами INSTEAD OF.