2011-12-07 31 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觸發器有什麼問題?

如果發生更新爲較小的值,觸發應該見好就收設定值的舊值(如果更新從未發生)

+0

total_winnings是否可以爲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;