2011-12-07 6 views
1
CREATE OR REPLACE TRIGGER Net_winnings_trigger 
    AFTER UPDATE OF total_winnings ON Players 
    FOR EACH ROW 
DECLARE 
    OldTuple OLD 
    NewTuple NEW 
BEGIN 
    IF(OldTuple.total_winnings > NewTuple.total_winnings) 
    THEN 
    UPDATE Players 
    SET total_winnings = OldTuple.total_winnings 
    WHERE player_no = NewTuple.player_no; 
END IF; 
END; 
/

私は 'total_winnings'フィールドが現在の値より大きい値に更新されることを許可するトリガーを取得しようとしています。Oracle Triggerの問題点を教えてください。

小さい値に更新が発生した場合(更新が発生したことがないかのように)、トリガは単に古い値に設定し、値のままにする必要があり

+0

合計金額がnullになることはありますか? –

答えて

3

あなたはで指定された値を上書きしたいので、 UPDATEステートメントでは、BEFORE UPDATEトリガーを使用する必要があります。このような何か

CREATE OR REPLACE TRIGGER Net_winnings_trigger 
    BEFORE UPDATE OF total_winnings ON Players 
    FOR EACH ROW 
BEGIN 
    IF(:old.total_winnings > :new.total_winnings) 
    THEN 
    :new.total_winnings := :old.total_winnings; 
    END IF; 
END; 

しかしUPDATE文で指定した値をオーバーライドするには、危険なゲームです。これが起こらないようにするには、アプリケーションに問題があることを認識させるために、エラーを発生させる必要があります。そうしないと、アプリケーションが間違った決定を下す可能性があります。

0

小さな値に更新しようとすると、更新が行われていないという事実は隠れていますが、これと同じように動作します。ユーザーには、すべてが機能しているように見えますが、データは変更されません。

CREATE OR REPLACE TRIGGER Net_winnings_trigger 
BEFORE UPDATE OF total_winnings 
ON Players 
FOR EACH ROW 
DECLARE 
BEGIN 
    :new.total_winnings := greatest(:old.total_winnings,:new.total_winnings); 
END; 
関連する問題