繁体   English   中英

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

[英]What's wrong with this PL/SQL Trigger?

我有这张表,我想在Magazine上创建一个触发器,如果插入的Magazine的名称是VoguePeople ,它会验证“插入后”。

如果它不是其中之一,它将被删除。

桌子:

  • 杂志(ISBN,MAG_NOM,PRIX_Mois);

我的触发器:

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;

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

这并不适合所有情况

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

这对我来说似乎是正确的,我做错了什么?

您不需要使用 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 错误。

此外,添加检查约束比创建触发器要好得多,例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM