我想创建一个触发器来管理两个杂志,"Elle"one_answers"Time"。
因此,如果用户试图在弹匣表中插入与这两者不匹配的新记录,则不应保留后者。
我已经准备好了所有的桌子和东西——这没有问题。
问题是我无法找到正确的方法,一位朋友说我的这段代码只与行交互,我需要一个完整表的代码,并建议我使用光标。
这是我的代码:
Create or replace trigger TMag
After INSERT on Magazine
FOR EACH ROW
DECLARE
e EXCEPTION;
BEGIN
IF :new.mag_nom!= 'Elle' or :new.mag_nom!= 'Time' THEN
Delete from Magazine where ISBN=:new.ISBN;
raise e;
END IF;
exception
when e then dbms_output.put_line('nom mag incorrecte');
END;
下面是我的桌子:
CLIENT(CIN, CL_NOM, CL_ADDR, CL_VILLE, EMAIL, CONTACT_NUM);
MAGAZINE(ISBN, MAG_NOM, PRIX_Mois);
ABONNEMENT(AB_ID, #ISBN, #IN_ID, Months);
INVOICE(IN_ID, #CIN, dateI, State) ;
提前感谢
我认为您不需要触发器,而是通过创建CHECK
约束(如(在内部解决问题
ALTER TABLE Magazine
ADD CONSTRAINT correcte_mag_nom
CHECK (mag_nom IN ('Elle', 'Time'));
如果提供的值不符合mag_nom
列的条件,则它将作为抛出
ORA-02290 check constrain (<schema>.CORRECTE_MAG_NUM) violated
您不能在触发器所属的同一个表上使用DML(您的删除(。将触发器更改为在插入之前激发,只需引发错误即可防止插入。
请注意,您还必须为异常声明一个代码号,并且您的逻辑应该是if-new.name!='Elle'ANDnew.name!='时间"。如果使用";OR";那么您的触发器将根本不允许在表上插入任何内容。。。
CREATE OR REPLACE TRIGGER TMAG
BEFORE INSERT ON MAGAZINE
FOR EACH ROW
DECLARE
e_bad_mag_nom EXCEPTION;
PRAGMA EXCEPTION_INIT (e_bad_mag_nom, -20001)
BEGIN
IF :new.mag_nom!= 'Elle' AND :new.mag_nom!= 'Time' THEN
raise e_bad_mag_nom;
END IF;
EXCEPTION
when e_bad_mag_nom then dbms_output.put_line('nom mag incorrecte');
END;
参考资料请参见此处:
- https://www.oracletutorial.com/plsql-tutorial/plsql-raise/
- 如何在触发器中引发异常?有办法做到这一点吗