这个 PL/SQL 触发器有什么问题?

What's wrong with this PL/SQL Trigger?

我有这个 table,我想在 Magazine 上创建一个触发器,如果​​插入的 Magazine 的名称是 [=29],它会验证“插入后” =]Vogue 或 People.

如果不是其中之一,则会被删除。

Table:

我的触发器:

CREATE OR REPLACE TRIGGER TMag
  AFTER INSERT ON Magazine
  FOR EACH ROW
DECLARE
  e EXCEPTION;
BEGIN
  IF :new.mag_nom != 'Vogue' or :new.mag_nom != 'People' THEN
     DELETE Magazine WHERE ISBN = :new.ISBN;
    RAISE e;
  END IF;
EXCEPTION
  WHEN e THEN
    DBMS_OUTPUT.PUT_LINE('nom mag incorrecte');
END;

但问题是我的老师告诉我:

This is not suitable for every situation

我不知道那是什么意思,你能帮我改进一下这个触发器吗?

我觉得是对的,我做错了什么?

您不需要使用 DML,将触发器转换成这个

CREATE OR REPLACE TRIGGER TMag
  AFTER INSERT ON Magazine
  FOR EACH ROW
BEGIN
  IF :new.mag_nom NOT IN ('Vogue','People') THEN
    RAISE_APPLICATION_ERROR(-20202,'nom mag incorrecte !');
  END IF;
END;
/

在这种情况下,你会得到 table is mutating 错误,因为在触发器的主体中使用 table,在其上创建了触发器。

此外,添加检查约束比创建触发器(例如

要好得多
ALTER TABLE abc
ADD CONSTRAINT cc_mag_nom
  CHECK (mag_nom IN ('Vogue','People'));