Что не так с моим Oracle Trigger? - PullRequest
       0

Что не так с моим Oracle Trigger?

1 голос
/ 07 декабря 2011
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' до значения, превышающего текущее значение.

Если происходит обновление до меньшего значения, триггер должен просто оставить для установленного значения старое значение (как если бы обновление никогда не происходило)

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

Поскольку вы хотите переопределить значение, указанное в операторе 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 голосов
/ 07 декабря 2011

Примерно так должно работать .. хотя будет скрываться тот факт, что обновление не происходит, если вы попытаетесь обновить его до меньшего значения.Для пользователя все будет выглядеть так, как будто оно работает, но данные останутся без изменений.

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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...