sql - PostgreSQL 触发器更新所有表而不是行
问题描述
我正在尝试创建一个 PostgreSQL 触发器,该触发器在某些特定值发生变化时更新一行。
我有一个表,其中包含有关用户的信息(user_code、user_email、user_name、user_password 和一个名为 password_reset 的字段)。
我的目标是将password_reset
字段更新为 value"Y"
并将user_password
字段更新为 value "123456"
,但只是在user_name
oruser_email
字段发生任何更改时。我希望这发生在进行更改的特定行中。我使用了 AFTER UPDATE 触发器。但是,整个表被更新,而不是我想要的行。
解决方案
如果要修改新行,则应使用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();
推荐阅读
- javascript - React 流程图:自动布局
- ignite - Apache Ignite .Net 生成 QueryEntity
- python - 如何获取使用 ImageDataGenerator 为双输入 CNN 模型构建的数据集的标签?
- node.js - 使用一个命令为 discord.js 中的所有通道设置慢模式
- sql - 如何在 SQL 查询中使用基于布尔数据类型的 LIKE 运算符?
- java - 计算网格中的方块
- android - Kotlin Android 完成上层活动
- outlook - 启用 onsend 插件后,Outlook Mac 本地无法发送
- cookies - 删除 cookie 不是删除 cookie
- mongodb - MongoDB聚合:如何从两个不同集合的两个数组中查找公共元素