Oracle SQLDeveloper SQL触发器创建问题我无法解决
我想创建一个触发器来管理两本杂志《Elle》和《Time》 因此,如果用户试图在杂志表中插入与这两条不匹配的新记录,则不应保留后者 我已经准备好了所有的桌子和东西,这没有问题 问题是我想不出正确的方法,一位朋友说我的代码只与行交互,我需要整个表的代码,并建议我使用游标 这是我的密码:Oracle SQLDeveloper SQL触发器创建问题我无法解决,oracle,plsql,triggers,Oracle,Plsql,Triggers,我想创建一个触发器来管理两本杂志《Elle》和《Time》 因此,如果用户试图在杂志表中插入与这两条不匹配的新记录,则不应保留后者 我已经准备好了所有的桌子和东西,这没有问题 问题是我想不出正确的方法,一位朋友说我的代码只与行交互,我需要整个表的代码,并建议我使用游标 这是我的密码: Create or replace trigger TMag After INSERT on Magazine FOR EACH ROW DECLARE e EXCEPTION; BEGIN IF :new.mag
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) ;
提前感谢您不能在触发器所属的同一个表上使用DML-your-delete。将触发器更改为在插入之前触发,然后只引发错误以防止插入首先发生 请注意,您还必须为异常声明一个代码号,并且您的逻辑应该是if new.name!='Elle'和new.name!='时间'。如果使用或,则触发器将不允许在表上进行任何插入
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;
参考资料请参见此处:
不能在触发器所属的同一个表上使用DML和delete。将触发器更改为在插入之前触发,然后只引发错误以防止插入首先发生 请注意,您还必须为异常声明一个代码号,并且您的逻辑应该是if new.name!='Elle'和new.name!='时间'。如果使用或,则触发器将不允许在表上进行任何插入
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;
参考资料请参见此处:
我认为您不需要触发器,而是通过创建检查约束(如
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
我认为您不需要触发器,而是通过创建检查约束(如
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