2012-01-16 5 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; 

изменяет ключ status_fk forieng на свойства таблицы, но он не обновляет дату истечения срока действия до sysdate + 90?

любая идея, почему это происходит?

+0

В стороне от необходимости выбирать из «статуса» каждый раз, чтобы получить идентификатор «новый» и т. Д., Использование суррогатов сошло с ума! –

+0

Вы можете удалить внешнюю комбинацию 'begin ... end'. В этом нет необходимости. – Ben

ответ

7

Вы должны сделать это в ПЕРЕД 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