2012-01-16 7 views
2

전자 트리거를 실행하려고 시도하지만 실행하지만 원하는대로하지 않습니다. 이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

제쳐두고, '신종'에 대한 ID를 얻기 위해 매번 '상태'를 선택해야하는 등 대리자를 사용하는 것이 미쳐 버렸습니다! –

+0

외부'begin ... end' 콤보를 제거 할 수 있습니다. 그럴 필요가 없습니다. – Ben

답변

7

당신은 UPDATE BEFORE 트리거에서이 작업을 수행해야하고, 당신이 필요로하는 코드는 다음과 같습니다

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

즉 당신은 트리거의 값을 할당 , 다른 UPDATE하지 않습니다.

AFTER 트리거에서 값을 수정할 수 없으므로 BEFORE 트리거 여야합니다.

+0

많은 사람. 그것은 일했다 :) – Illyricum