Триггер в базе данных Oracle Sql - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть некоторые проблемы, которые необходимо решить в моей базе данных sql:

  • убедитесь, что у игрока может быть только 2 желтые карточки или одна красная
  • , а в команде не может быть больше 5иностранные игроки (игрок, национальность которого отличается от французского)

Моя модель выглядит примерно так:

Team
-------
team_id (PK)
name

Player
-------
player_id (PK)
team_id (FK)
name
number_yellow_cards
number_red_cards
nationality

Я думаю, что триггер может решить мои проблемы.Вот мой триггер, но он не работает в любой ситуации (вставка / обновление)

create or replace TRIGGER foreign_players
Before Insert OR UPDATE on Player
FOR EACH ROW 
DECLARE nr_foreign_players INTEGER;
Begin

  IF INSERTING THEN
    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,'Error insert' ); 
    End If;
  END IF; --INSERTING

  IF UPDATING THEN
    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,'Error update' ); 
    End If;
  END IF; --UPDATING


End;

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 19 декабря 2018

Это не может быть уверен на 100%, поскольку вы точно не сказали нам, что не работает в любой ситуации .

Я вижу несколько проблем с вашим триггером:

  1. Логика обеспечения того, что в команде не может быть более 5 не французских игроков, кажется правильной, однако, почему вы дублируете ее для INSERT и UPDATE?Это можно упростить.

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