我想不通的 Oracle SQL Developer SQL TRIGGER 创建问题
Posted
技术标签:
【中文标题】我想不通的 Oracle SQL Developer SQL TRIGGER 创建问题【英文标题】:Oracle SQLDevelopper SQL TRIGGER Creation Problem That I Can't Figure Out 【发布时间】:2021-01-03 03:53:32 【问题描述】:我想创建一个触发器来管理 2 个杂志,“Elle”和“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) ;
提前致谢
【问题讨论】:
【参考方案1】:我认为您不需要触发器,而是通过创建 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
【讨论】:
【参考方案2】:您不能在触发器所属的同一个表上使用 DML(您的删除)。将触发器更改为在插入之前触发,然后引发错误以防止插入发生。
请注意,您还必须为异常声明一个代码编号,并且您的逻辑应该是 if new.name!='Elle' AND new.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/ How to raise an Exception inside a Trigger? Is there a way to do this?【讨论】:
以上是关于我想不通的 Oracle SQL Developer SQL TRIGGER 创建问题的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL Developer 登录 Oracle 12c(转)
为啥plsql develope 打开.sql文件时会生成后缀名为.~sql文件