PostgreSQL触发器更新所有表而不是行

PostgreSQL触发器更新所有表而不是行,sql,postgresql,function,triggers,Sql,Postgresql,Function,Triggers,我正在尝试创建一个PostgreSQL触发器,每当某些特定值发生更改时,它就会更新一行 我有一个表,其中包含有关用户的信息(用户代码、用户电子邮件、用户名称、用户密码和名为密码重置的字段) 我的目标是将password\u reset字段更新为值“Y”,user\u password字段更新为值“123456”,但就在user\u name或user\u email字段发生任何更改时。我希望在进行更改的特定行中发生这种情况。我使用了更新后触发器。 但是,将更新整个表,而不是我想要的行。如果要修改

我正在尝试创建一个PostgreSQL触发器,每当某些特定值发生更改时,它就会更新一行

我有一个表,其中包含有关用户的信息(用户代码、用户电子邮件、用户名称、用户密码和名为密码重置的字段)

我的目标是将
password\u reset
字段更新为值
“Y”
user\u password
字段更新为值
“123456”
,但就在
user\u name
user\u email
字段发生任何更改时。我希望在进行更改的特定行中发生这种情况。我使用了更新后触发器。
但是,将更新整个表,而不是我想要的行。

如果要修改新行,应在触发器之前使用
,而不是尝试
更新表:

CREATE FUNCTION trial() RETURNS trigger AS
$$BEGIN
    IF NEW.user_name IS DISTINCT FROM OLD.user_name OR
       NEW.user_email IS DISTINCT FROM OLD.user_email
    THEN
        NEW.password_reset := 'Y';
        NEW.user_password := '123456';
    END IF;

    RETURN NEW; 
END;$$ LANGUAGE plpgsql;

CREATE TRIGGER trial1 BEFORE UPDATE OF user_name, user_email
    ON tb_user FOR EACH ROW EXECUTE PROCEDURE trial();

旁注:将密码重置为固定值可能是一个安全问题。而是创建一个随机的,你告诉用户通过一个安全的渠道。更糟糕的是,你的密码似乎是以明文形式存储的。不要那样做。Salt并对其进行散列,只存储Salt和散列值。问题在于:
其中NEW.user\u name不同于旧的.user\u name
。如果
测试已经建立,那么
WHERE将始终计算为true,并且由于您在WHERE上没有其他条件,因此所有行都将更新,所有数据都不会用于任何实际用途。。。只是学习使用触发器。但我会在未来记住这一点!:)