PostgreSQL触发器更新所有表而不是行
我正在尝试创建一个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字段发生任何更改时。我希望在进行更改的特定行中发生这种情况。我使用了更新后触发器。 但是,将更新整个表,而不是我想要的行。如果要修改
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上没有其他条件,因此所有行都将更新,所有数据都不会用于任何实际用途。。。只是学习使用触发器。但我会在未来记住这一点!:)