首页 > 解决方案 > PostgreSQL 触发器更新所有表而不是行

问题描述

我正在尝试创建一个 PostgreSQL 触发器,该触发器在某些特定值发生变化时更新一行。

我有一个表,其中包含有关用户的信息(user_code、user_email、user_name、user_password 和一个名为 password_reset 的字段)。

我的目标是将password_reset字段更新为 value"Y"并将user_password字段更新为 value "123456",但只是在user_nameoruser_email字段发生任何更改时。我希望这发生在进行更改的特定行中。我使用了 AFTER UPDATE 触发器。但是,整个表被更新,而不是我想要的行。

标签: sqlpostgresqlfunctiontriggers

解决方案


如果要修改新行,则应使用BEFORE触发器而不是尝试对UPDATE表:

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();

推荐阅读