2012-01-16 33 views
2

我试图执行e触发器,它执行但它没有做我想做的事。UPDATE TRIGGER?

确定这些表,我需要两个表吧

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)) 

这是触发

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; 

我想更新SYSDATE + 90时statustype从“新”改为'批准”

我更新它

update properties set status_fk = 2 where idproperties = 12; 

它会更改表属性上的forieng键status_fk,但它不会将到期日期更新为sysdate + 90?

任何想法为什么会发生这种情况?

+0

另一方面,每次都必须从'status'中选择以获得'new'的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; 

即你在触发分配的价值,你不这样做的另一个更新。

它必须是BEFORE触发器,因为您无法修改AFTER触发器中的值。

+0

thx很多人。有效 :) – Illyricum