[英]Trigger on Oracle Sql database
我在sql數據庫上有一些問題要解決:
我的模型是這樣的:
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%肯定的答案,因為您沒有完全告訴我們在任何情況下都不起作用 。
我發現您的觸發器有幾個問題:
確保一支球隊不能擁有超過5名非法國球員的邏輯似乎是正確的,但是為什么要為INSERT
和UPDATE
復制它呢? 這可以簡化。
您根本無法驗證玩家只能擁有2張黃牌或1張紅牌
這是應該完成工作的更新的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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.