我想不通的 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 创建问题的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL Develope连接oracle数据库配置

PL/SQL Developer 登录 Oracle 12c(转)

为啥plsql develope 打开.sql文件时会生成后缀名为.~sql文件

Oracle SQL Developer Chanage UI to US Lanaguage

pl_sql develope连接远程数据库的方法

PL SQL 12.0.7的安装及注册码,汉化包,连接Oracle远程数据库,中文乱码问题处理