2012-01-16 14 views
2

私はeトリガーを実行しようとしていますが、実行しますが、私が望むことをしません。UPDATE TRIGGER?

OKこれらは、これは私がstatustypeが「への「新規」から変更されたときにSYSDATE + 90を更新するトリガー

CREATE OR REPLACE TRIGGER Property_Update 

AFTER UPDATE ON Properties REFERENCING OLD AS OLD NEW AS NEW 
FOR EACH ROW 


BEGIN 
DECLARE 
val_new VARCHAR2(20); 
val_app VARCHAR2(20); 
BEGIN 
    select idstatus into val_new from status where STATUSTYPE='New'; 
    select idstatus into val_app from status where STATUSTYPE='Approved';   

IF :OLD.status_fk=val_new AND :NEW.status_fk=val_app THEN 
    UPDATE Properties SET DateOfExiration=(sysdate+90) WHERE 
idProperties= :NEW.idProperties; 


END IF; 


END; 
END; 

である私はそれのために必要な二つのテーブル

create table Properties( 
     idProperties number(20) NOT NULL, 
     Typee varchar2(20) NOT NULL, 
     SquareMeters varchar2(20) NOT NULL, 
     Rooms number(20) NOT NULL, 
     ConstructionDate date NOT NULL, 
     FloorLocation varchar(20), 
     Price number(20) NOT NULL, 
     CityView varchar2(20), 
     DateOfInsert date NOT NULL, 
     DateOfExiration date NOT NULL, 
     Address_FK number(20), 
     Service_FK number(20), 
     OwnerAgent_FK number(20), 
     Status_FK number(20), 
     PropertyService_FK number(20)) 

create table Status(
     idStatus number(20) NOT NULL, 
     statustype varchar2(20)) 

テーブルです」

を承認し、私はそれを

update properties set status_fk = 2 where idproperties = 12; 
を更新しています

テーブルプロパティのforiengキーstatus_fkを変更しますが、有効期限をsysdate + 90に更新しませんか?

これはなぜ起こっているのでしょうか?

+0

「ステータス」から「新規」などのIDを取得するたびに選択する必要があります。サロゲートの使用は怒っています! –

+0

外部の 'begin ... end'コンボを削除することができます。それは必要ありません。 – Ben

答えて

7

あなたは BEFORE UPDATEトリガーでこれを行う必要があり、あなたが必要とするコードがある:あなたが引き金に値を割り当てる

IF :OLD.status_fk=val_new AND :NEW.status_fk=val_app THEN 
    :NEW.DateOfExiration := (sysdate+90); 
END IF; 

つまり、あなたが別の更新を行いません。

AFTERトリガーで値を変更できないため、これはBEFOREトリガーでなければなりません。

+0

多くの男。出来た :) – Illyricum