SQL触发电子邮件唯一

时间:2015-04-09 17:56:55

标签: sql oracle triggers

我想创建一个触发器(而不是约束)来验证电子邮件是否已经存在。如果是这样,触发器会引发错误。如果没有,则将电子邮件插入表格中。

我从这开始,但它无法正常工作:

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;

1 个答案:

答案 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';

返回

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

因此,通常建议使用UNIQUE约束。谢谢你的注意!