2016-05-22 1 views
0

異なるテーブルの価格を数えるトリガーを作りたいと思います。異なるテーブルに接続されたOracleトリガー

それは次のようになります。

PART_PRICE(from PARTS) + TIME(from PARTS) * SALARY_PER_HOUR(from MECHANIC) 

、結果は(予約から)PRICEに保存する必要があり、テーブルの予約はID_PARTとID_MECHANICがPARTS & MECHANICに接続されているが含まれています。

私は本当にそれを行う方法を知らない、あなたは私を助けることができますか?

+4

[トリガーでビジネスロジックを入れないでください](http://stackoverflow.com/questions/34362598/trigger-cant-read-the-table-after-being-fired-by-the-same-テーブル/ 34371316#34371316)。いいえ、真剣に、[私はそれを意味する - [トリガーにビジネスロジックを入れない](http://stackoverflow.com/questions/31998789/trigger-to-enforce-m-m-relationship/32009988#32009988)! –

答えて

0

最初に、トリガーはDDLステートメントで起動する必要があります。どのテーブル変更をトリガーしたいのかという疑問からは明らかではありません。あなたの質問によると、ID_PARTまたはID_MECHANICに変更がある場合、Reservationsテーブルの価格列を更新したいと思います。以下のコードを見つけてください。

CREATE TRIGGER trgAfterUpdate AFTER UPDATE ON RESERVATIONS 
FOR EACH ROW 
AS 
    declare part_id int; 
    declare mechanic_id int; 
    declare time long; 
    declare part_price decimal(10,2); 
    declare mechanic_sal decimal(10,2); 

    if NEW.ID_PART <> OLD.ID_PART 
     part_price = select PART_PRICE from parts where id_part=new.id_part; 
     time = select TIME from parts where id_part=new.id_part; 
     mechanic_sal = select SALARY_PER_HOUR from mechanic where id_mechanic=old.id_mechanic; 
     update RESERVATIONS set PRICE = part_price+time*mechanic_sal where ID_PART=NEW.ID_PART and ID_MECHANIC=OLD.id_mechanic; 
    else if NEW.ID_MECHANIC <> OLD.ID_MECHANIC 
     part_price = select PART_PRICE from parts where id_part=old.id_part; 
     time = select TIME from parts where id_part=old.id_part; 
     mechanic_sal = select SALARY_PER_HOUR from mechanic where id_mechanic=new.id_mechanic; 
     update RESERVATIONS set PRICE = part_price+time*mechanic_sal where ID_PART=OLD.ID_PART and ID_MECHANIC=NEW.id_mechanic; 
GO 
関連する問題