【问题标题】:PostgreSQL Trigger ExceptionPostgreSQL 触发异常
【发布时间】:2012-04-07 13:13:51
【问题描述】:

我在 PostgreSQL 8.4 中创建此触发器时遇到问题。

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 列存在!

谁能帮帮我?

【问题讨论】:

    标签: postgresql triggers plpgsql postgresql-8.4 procedures


    【解决方案1】:

    你很可能被大写的名字绊倒了。我不厌倦建议不要使用这些。

    你可能有一个名为

    的列
    "Nombre_usuario"
    

    用双引号 ("") 括起来,保留混合大小写的拼写。
    但是在你的触发函数中你写:

    NEW.Nombre_usuario
    

    不带双引号。不带引号的标识符被转换为小写。所以这是一样的:

    NEW.nombre_usuario
    

    但不是:

    NEW."Nombre_usuario"
    

    始终将混合大小写标识符用双引号引起来。或者(更好)只使用小写标识符开头并省去麻烦。
    NEW row in a trigger function 的标识符从不被引用。)

    进一步阅读:

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 2019-07-10
      相关资源
      最近更新 更多