ORA-22816,同时使用而不是触发器更新连接视图
ORA-22816 while updating Joined View with Instead of trigger
我阅读了很多相关内容,但没有找到任何帮助。
我的情况:
我有两个属于一起的数据库表。我想用 EntityFramework 查询这个表。因为 Table B 包含 EntityFramework 鉴别器(用于为 Table A 选择正确的 class)我创建了一个连接 Table A 和 TableB.
这个连接很简单。但是:我还想用那个视图存储数据。问题是,EntityFramework 也想存储鉴别器。但这是不可能的,因为它会将 update/insert 分成两个表。
所以我尝试创建一个 "Instead of" 触发器到 update/insert Table A(因为 Table B 无关紧要,永远不会更新) .
当我创建触发器时 - 一切正常。如果我插入带有 SQL 语句的内容 - 一切都很好。但是:如果我直接在视图中插入(使用 Oracle SQL Developer),它会抛出如下异常:
ORA-22816 (unsupported feature with RETURNING clause).
如果我对 EntityFramework 做同样的事情,我会得到同样的错误。有人可以帮助我吗?
在我的代码下方:
Table A 和 Table 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" 而不是插入。但是得到了相同的错误信息。
有人知道怎么解决吗?或者有人有好的选择(更好的想法)吗?
谢谢!
注意:我还为TableA的ID定义了一个序列,这样它就会自动生成。
// 编辑:
我找到了 MS SQL:
的可能解决方案
但我不知道如何将其转换为 Oracle...我怎样才能 return 从触发器中得到一些东西?
Note: I've also defined a sequence for TableA's ID so that it will be generated automatically.
在 EF StoreGenerated 中,Oracle 中的键与 INSTEAD OF 触发器不兼容。 EF 使用 RETURNING 子句输出存储生成的键,这不适用于 INSTEAD OF 触发器。
我阅读了很多相关内容,但没有找到任何帮助。
我的情况: 我有两个属于一起的数据库表。我想用 EntityFramework 查询这个表。因为 Table B 包含 EntityFramework 鉴别器(用于为 Table A 选择正确的 class)我创建了一个连接 Table A 和 TableB.
这个连接很简单。但是:我还想用那个视图存储数据。问题是,EntityFramework 也想存储鉴别器。但这是不可能的,因为它会将 update/insert 分成两个表。
所以我尝试创建一个 "Instead of" 触发器到 update/insert Table A(因为 Table B 无关紧要,永远不会更新) .
当我创建触发器时 - 一切正常。如果我插入带有 SQL 语句的内容 - 一切都很好。但是:如果我直接在视图中插入(使用 Oracle SQL Developer),它会抛出如下异常:
ORA-22816 (unsupported feature with RETURNING clause).
如果我对 EntityFramework 做同样的事情,我会得到同样的错误。有人可以帮助我吗?
在我的代码下方:
Table A 和 Table 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" 而不是插入。但是得到了相同的错误信息。
有人知道怎么解决吗?或者有人有好的选择(更好的想法)吗?
谢谢!
注意:我还为TableA的ID定义了一个序列,这样它就会自动生成。
// 编辑: 我找到了 MS SQL:
的可能解决方案
但我不知道如何将其转换为 Oracle...我怎样才能 return 从触发器中得到一些东西?
Note: I've also defined a sequence for TableA's ID so that it will be generated automatically.
在 EF StoreGenerated 中,Oracle 中的键与 INSTEAD OF 触发器不兼容。 EF 使用 RETURNING 子句输出存储生成的键,这不适用于 INSTEAD OF 触发器。