簡體   English   中英

在Oracle Sql數據庫上觸發

[英]Trigger on Oracle Sql database

我在sql數據庫上有一些問題要解決:

  • 確保玩家只能有2張黃牌或1張紅牌
  • 一個團隊最多只能有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;

有人可以幫助我嗎?

這並不是100%肯定的答案,因為您沒有完全告訴我們在任何情況下都不起作用

我發現您的觸發器有幾個問題:

  1. 確保一支球隊不能擁有超過5名非法國球員的邏輯似乎是正確的,但是為什么要為INSERTUPDATE復制它呢? 這可以簡化。

  2. 您根本無法驗證玩家只能擁有2張黃牌或1張紅牌

這是應該完成工作的更新的SQL代碼。 它會逐個執行每個檢查,一旦一項檢查失敗,就會引發應用程序異常。 INSERTUPDATE操作之間沒有區別,因為這兩個操作的邏輯完全相同。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM