这个 PL/SQL 触发器有什么问题?
What's wrong with this PL/SQL Trigger?
我有这个 table,我想在 Magazine
上创建一个触发器,如果插入的 Magazine
的名称是 [=29],它会验证“插入后” =]Vogue 或 People.
如果不是其中之一,则会被删除。
Table:
- 杂志(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;
但问题是我的老师告诉我:
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'));
我有这个 table,我想在 Magazine
上创建一个触发器,如果插入的 Magazine
的名称是 [=29],它会验证“插入后” =]Vogue 或 People.
如果不是其中之一,则会被删除。
Table:
- 杂志(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;
但问题是我的老师告诉我:
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'));