我有這個表,我想在 上創建一個觸發器Magazine,如果插入的名稱Magazine是Vogue或People,它會驗證“插入后” 。
如果它不是其中之一,它將被洗掉。
桌子:
- 雜志 (ISBN, MAG_NOM, PRIX_Mois);
我的觸發器:
CREATE OR REPLACE TRIGGER TMag
AFTER INSERT ON Magazine
FOR EACH ROW
DECLARE
e EXCEPTION;
BEGIN
IF :new.mag_nom != 'Vogue' or :new.mag_nom != 'People' THEN
DELETE Magazine WHERE ISBN = :new.ISBN;
RAISE e;
END IF;
EXCEPTION
WHEN e THEN
DBMS_OUTPUT.PUT_LINE('nom mag incorrecte');
END;
但問題是我的老師告訴我:
這并不適合所有情況
我不知道這是什么意思,你能幫我改進這個觸發器嗎?
這對我來說似乎是正確的,我做錯了什么?
uj5u.com熱心網友回復:
你不需要使用DML,將觸發器轉換成這個
CREATE OR REPLACE TRIGGER TMag
AFTER INSERT ON Magazine
FOR EACH ROW
BEGIN
IF :new.mag_nom NOT IN ('Vogue','People') THEN
RAISE_APPLICATION_ERROR(-20202,'nom mag incorrecte !');
END IF;
END;
/
在這種情況下,由于在觸發器主體內使用創建觸發器的表,您會得到 table is mutating 錯誤。
此外,添加檢查約束比創建觸發器要好得多,例如
ALTER TABLE abc
ADD CONSTRAINT cc_mag_nom
CHECK (mag_nom IN ('Vogue','People'));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387417.html
上一篇:如何從SQL查詢中獲得最大結果?
