Oracle ORA-01732:使用触发器和联合视图的此视图上的数据操纵操作不合法
嗨,我创建了两个表Oracle ORA-01732:使用触发器和联合视图的此视图上的数据操纵操作不合法,oracle,triggers,union,Oracle,Triggers,Union,嗨,我创建了两个表 CREATE TABLE "LCM_001"."LCM_BDT$ACT" ( "ID" NUMBER(*,0) NOT NULL ENABLE, "SHORTDESCRIPTION" VARCHAR2(25 CHAR), "LONGDESCRIPTION" VARCHAR2(500 BYTE), "VALIDFROM" TIMESTAMP (6) WITH LOCAL TIME ZONE, "VALIDTO" TIMES
CREATE TABLE "LCM_001"."LCM_BDT$ACT"
( "ID" NUMBER(*,0) NOT NULL ENABLE,
"SHORTDESCRIPTION" VARCHAR2(25 CHAR),
"LONGDESCRIPTION" VARCHAR2(500 BYTE),
"VALIDFROM" TIMESTAMP (6) WITH LOCAL TIME ZONE,
"VALIDTO" TIMESTAMP (6) WITH LOCAL TIME ZONE,
"VERSION" NUMBER(*,0) NOT NULL ENABLE
)
第二个表与第一个表完全相同,因此我创建它时使用了“
然后我创建了一个视图
select * from LCM_BDT$ACT
Union
select * from LCM_BDT$HIST
然后我写了一个而不是触发器
create or replace TRIGGER LCM_BDT_DML
instead of insert
on LCM_BDT
-- for each row
declare
vAct LCM_BDT$ACT%rowtype;
vHist LCM_BDT$HIST%rowtype;
begin
IF INSERTING THEN
select BDT_SEQ.nextval into vAct.id from dual;
vAct.SHORTDESCRIPTION := :new.SHORTDESCRIPTION;
vAct.LONGDESCRIPTION := :new.LONGDESCRIPTION;
vAct.VALIDFROM := sysdate;
vAct.VALIDTO := TO_TIMESTAMP('31.12.3999','DD.MM.YYYY');
vAct.Version := 1;
Insert into LCM_BDT$ACT values vAct;
END IF;
IF UPDATING THEN
-- vHist.ID := :old.ID;
-- vHist.SHORTDESCRIPTION := :old.SHORTDESCRIPTION;
-- vHist.LONGDESCRIPTION := :old.LONGDESCRIPTION;
-- vHist.VALIDFROM := :old.VALIDFROM;
-- vHist.VALIDTO := sysdate;
-- vHist.VERSION := :old.Version;
--
-- Insert into LCM_BDT$ACT values vAct;
-- -- new record
-- UPDATE LCM_BDT$HIST set
-- vAct.SHORTDESCRIPTION := :new.SHORTDESCRIPTION;
-- vAct.LONGDESCRIPTION := :new.LONGDESCRIPTION;
-- vAct.VALIDFROM := sysdate;
-- vAct.VALIDTO := TO_TIMESTAMP('31.12.3999','DD.MM.YYYY');
-- vAct.Version := :old.Version +1;
-- Insert into LCM_BDT$HIST values vHist;
delete from LCM_BDT where id = :old.ID;
END IF;
END LCM_BDT_DML;
问题是我总是遇到一个SQL错误:
SQL Fehler:ORA-01732:此视图上的数据操作不合法
01732.00000-“此视图上的数据操作不合法”
*原因:*行动: 有什么建议吗
如果更新分支机构的内容包括:
delete from LCM_BDT where id = :old.ID;
这是试图从该触发器所针对的同一视图中删除,而不是任何一个基础表。(假设,如果插入到BDT$ACT
和BDT$HIST
中的内容没有被注释掉,您可能真的想删除旧的BDT$ACT
记录?或者两者都要删除-可能最终会通过视图删除。)
由于触发器只是而不是insert
,因此实际上无法到达;但是任何更新或删除视图的尝试都会得到错误,因为触发器不包括这两个操作
您可以通过将触发器更改为以下值来允许更新和删除(删除部分时需要:
instead of insert or update or delete
on LCM_BDT
请发布导致此错误的代码。可能需要更新吗?
instead of insert or update or delete
on LCM_BDT