繁体   English   中英

SQL触发电子邮件唯一

[英]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';

退货

  1. 00000-“表%s。%s正在变异,触发器/函数可能看不到它” *原因:触发器(或此语句中引用的用户定义的plsql函数)试图查看(或修改)一个表,该表正在被触发它的语句修改。 *操作:重写触发器(或函数),使其不读取该表。

因此,通常建议使用UNIQUE约束。 感谢您的来信!

暂无
暂无

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

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