2012-03-22 146 views
0

我在与PostgreSQL中8.4创建这个触发器问题。PostgreSQL触发异常

CREATE OR REPLACE FUNCTION tbi_Usuarios() RETURNS TRIGGER AS $tbi_Usuarios$ 
    BEGIN 
     IF trim(both ' ' from NEW.Nombre_usuario) = '' OR NEW.Nombre_usuario IS NULL THEN 
      RAISE EXCEPTION 'Debes ingresar un nombre de usuario.'; 
     END IF; 

    IF NEW.Password = '' OR NEW.Password IS NULL THEN 
     RAISE EXCEPTION 'Debes ingresar una contraseña correctamente'; 
    ELSE 
     NEW.Password := md5(NEW.Password); 
    END IF; 

    IF Fecha_registro IS NULL THEN 
     NEW.Fecha_registro := current_timestamp; 
    END IF; 

    RETURN NEW; 
END; 
$tbi_Usuarios$ LANGUAGE plpgsql; 

DROP TRIGGER IF EXISTS tr_tbi_Usuarios ON "Usuarios"; 
CREATE TRIGGER tr_tbi_Usuarios BEFORE INSERT ON "Usuarios" 
FOR EACH ROW EXECUTE PROCEDURE tbi_Usuarios(); 

的事情是,当我尝试插入数据库中的一行,以下错误显示出来:

"el registro <<new>> no tiene un campo <<nombre_usuario>>" 

或英文:

"the table <<new>> doesn't have a column <<nombre_usuario>>" 

但在我数据库,我真的相信列Nombre_usuarioPasswordFecha_registro存在!

谁能帮助我吗?

回答

2

你最有可能绊倒大写的名字。我并不厌倦建议不要使用这些。

你可能有一个名为

"Nombre_usuario" 

用双引号(""),它保留了大小写混合的拼写列。
但在你的触发功能你写:

NEW.Nombre_usuario 

没有双引号。未加引号的标识符将转换为小写。因此,这是一样的:

NEW.nombre_usuario 

但不是:

NEW."Nombre_usuario" 

总是双引号大小写混合的标识符。或者(更好)专门使用小写标识符开始,并节省您的麻烦。

开始通过阅读手册中的一章"Identifiers and Key Words"

+0

谢谢!有效! – KGs 2013-04-13 15:58:22