Oracle SQLDevelopper SQL TRIGGER创建问题,我无法弄清楚



我想创建一个触发器来管理两个杂志,"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/
  • 如何在触发器中引发异常?有办法做到这一点吗

相关内容

最新更新