ORA-22816在更新加入的视图而不是触发

时间:2017-12-05 07:24:09

标签: oracle entity-framework database-trigger database-view

我读了很多关于它但没有找到任何帮助。

我的情况: 我有两个属于一起的数据库表。这个表我想用EntityFramework查询。因为表B包含EntityFramework的鉴别器(用于为表A选择正确的类),我创建了一个连接表A和表B的视图。

这种联接非常简单。但是:我还希望使用该View存储数据。问题是,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"进入触发器而不是插入。但是得到了相同的错误信息。

有人知道如何解决这个问题吗?或者有没有人有更好的选择(更好的想法)?

谢谢!

注意:我还为TableA的ID定义了一个序列,以便它自动生成。

//编辑: 我找到了一个可能的MS SQL解决方案:

https://stackoverflow.com/a/26897952/3598980

但我不知道如何将其转换为Oracle ...如何从触发器返回内容?

1 个答案:

答案 0 :(得分:0)

  
    

注意:我还为TableA的ID定义了一个序列,以便它自动生成。

  

在Oracle中,Oracle中的生成密钥与INSTEAD OF触发器不兼容。 EF使用RETURNING子句输出存储生成的键,这对INSTEAD OF触发器不起作用。