Это не может быть уверен на 100%, поскольку вы точно не сказали нам, что не работает в любой ситуации .
Я вижу несколько проблем с вашим триггером:
Логика обеспечения того, что в команде не может быть более 5 не французских игроков, кажется правильной, однако, почему вы дублируете ее для INSERT
и UPDATE
?Это можно упростить.
Вы совсем не подтверждаете, что игрок может иметь только 2 желтые карточки или одну красную
Вот обновленный код SQL, который должен выполнить работу.Он выполняет каждую проверку одну за другой, вызывая исключение приложения, как только одна проверка заканчивается неудачей.Не делается различий между операциями INSERT
и UPDATE
, поскольку логика абсолютно одинакова для обеих операций.
CREATE OR REPLACE TRIGGER foreign_players
BEFORE INSERT OR UPDATE ON Player
FOR EACH ROW
DECLARE
nr_foreign_players INTEGER;
BEGIN
IF NVL(:new.number_yellow_cards, 0) > 2 THEN
Raise_Application_Error(-20000, 'Too many yellow cards' );
END IF;
IF NVL(:new.number_red_cards, 0) > 1 THEN
Raise_Application_Error(-20000, 'Too many red cards' );
END IF;
SELECT Count(*) INTO nr_foreign_players
FROM
Team T
INNER JOIN Player P ON P.team_id = T.team_id
WHERE
P.team_id = :new.team_id
AND P.nationality <> 'French';
IF nr_foreign_players > 5 THEN
Raise_Application_Error(-20000, 'Too many foreign players' );
END IF;
END;