[英]SQL trigger email unique
我想创建一个触发器(而不是约束)来验证电子邮件是否已经存在。 如果是这样,触发器将引发错误。 如果不是,则将电子邮件插入到表中。
我从这个开始,但是没有用:
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;
由于命令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:存在的理由,合规性/无效性ORA-06512:在“ SCOTT.TRIGGER3”,第11行ORA-04088:执行触发器“ SCOTT.TRIGGER3”时出错
ps :根据Justin Cave的评论,使用上述触发器可能会导致表变异,例如:
INSERT INTO FV_CLIENT
SELECT COURRIEL
FROM FV_CLIENT
WHERE COURRIEL = 'mon.pere@paris.fr';
退货
- 00000-“表%s。%s正在变异,触发器/函数可能看不到它” *原因:触发器(或此语句中引用的用户定义的plsql函数)试图查看(或修改)一个表,该表正在被触发它的语句修改。 *操作:重写触发器(或函数),使其不读取该表。
因此,通常建议使用UNIQUE
约束。 感谢您的来信!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.