我想创建一个触发器(而不是约束)来验证电子邮件是否已经存在。如果是这样,触发器会引发错误。如果没有,则将电子邮件插入表格中。
我从这开始,但它无法正常工作:
CREATE OR REPLACE TRIGGER TRIGGER3
BEFORE INSERT ON FV_CLIENT FOR EACH ROW
BEGIN
IF EXISTS (SELECT COURRIEL FROM FV_CLIENT
WHERE COURRIEL=:new.courriel) THEN
raise_application_error(-20001,'Courriel deja existant, choisir une autre combinaison courriel/Mot de passe');
END IF;
END;
答案 0 :(得分:0)
由于命令raise_application_error
,我猜它是一个ORACLE数据库。假设你有这张表:
CREATE TABLE FV_CLIENT (
COURRIEL VARCHAR2(48)
);
你可以使用这个触发器:
CREATE OR REPLACE TRIGGER TRIGGER3
BEFORE INSERT ON FV_CLIENT FOR EACH ROW
DECLARE
CURSOR check_curriel IS
SELECT 1
FROM FV_CLIENT
WHERE COURRIEL = :new.COURRIEL;
x VARCHAR2(48);
BEGIN
OPEN check_curriel;
FETCH check_curriel INTO x;
IF NOT check_curriel%NOTFOUND THEN
CLOSE check_curriel;
raise_application_error(-20001,'Courriel deja existant, choisir une autre combinaison courriel/Mot de passe');
END IF;
CLOSE check_curriel;
END;
前两个INSERT
没有错误:
INSERT INTO FV_CLIENT VALUES ('mon.pere@paris.fr');
INSERT INTO FV_CLIENT VALUES ('mon.frere@lyon.fr');
第三个INSERT
按预期抛出异常:
INSERT INTO FV_CLIENT VALUES ('mon.pere@paris.fr');
Fehlerbericht - SQL-Fehler:ORA-20001:Courriel deja existant,choisir non autre combinaison courriel / Mot de passe ORA-06512:at “SCOTT.TRIGGER3”,第11行ORA-04088:执行触发期间出错 'SCOTT.TRIGGER3'
p.s。 :根据Justin Cave的评论,使用上面的触发器可能会导致变异表异常,例如:
INSERT INTO FV_CLIENT
SELECT COURRIEL
FROM FV_CLIENT
WHERE COURRIEL = 'mon.pere@paris.fr';
返回
- 00000 - “表%s。%s正在变异,触发/功能可能看不到它” *原因:触发器(或用户定义的plsql函数,在中引用) 这句话)试图查看(或修改)一个表 在被解雇它的声明修改的过程中。 *动作:重写触发器(或函数),使其不读取该表。
醇>
因此,通常建议使用UNIQUE
约束。谢谢你的注意!