2016-12-30 67 views
-1

こんにちは私は2番目の表は、最初のと全く同じなので、私はそれを作成した2つのテーブルORA-01732:トリガーと組合ビューのこのビューのデータ操作オペレーション法的ない

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 
    ) 

を作成「

create table LCM_BDT$HIST as select * from LCM_BDT$ACT where 1=0; 

は、その後、私はその後、私はWR

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; 

問題のOTEのAAは、私はなかれSQLエラーを得たことである:

SQL-Fehler:ORA-01732:このビュー 01732. 00000上のデータ操作オペレーション法的ません - "データ操作操作はこのビューでは正しくありません" *原因:
*処置:

いずれかの提案がありますか?

+2

このエラーの原因となるコードを投稿してくださいたぶん更新。? – Aleksej

答えて

2

あなたif updating分岐が含まれてありがとう:このトリガはないいずれかの基礎となる表の、反対している同じビューから削除しようとしている

delete from LCM_BDT where id = :old.ID; 

。 (?BDT$ACTBDT$HISTへの挿入がコメントアウトされていない場合はおそらく、あなたは本当に古いBDT$ACTレコードまたは両方を削除したい - 。おそらく最終的にはビュー経由)

トリガが唯一instead of insertあるので、そのことができます実際には到達していない。ビューを更新または削除しようとすると、トリガーはこれらの操作のいずれもカバーしないため、エラーが発生します。

あなたはするトリガーを変更することにより、when deletingセクションが必要になる(更新を許可し、削除することができます。

instead of insert or update or delete 
on LCM_BDT 
関連する問題