You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL校验id_user与id_manager不等的触发器未生效如何解决

问题原因

你编写的触发器函数存在逻辑错误:函数内的SELECT id_user FROM users和SELECT id_manager FROM users是针对整张users表执行全表查询,仅会返回表中第一行的对应字段值,完全没有校验当前待插入/更新行的id_user和id_manager,所以匹配不到你预期的校验规则,异常自然不会触发。

修复方案

直接修改触发器函数,使用行级触发器专属的NEW变量,获取当前待插入/更新行的两个字段做对比即可:

create or replace function "Test"() returns trigger
    language plpgsql
as
$func$
BEGIN
  -- 直接校验当前行的两个字段值
  IF NEW.id_user = NEW.id_manager THEN
    RAISE EXCEPTION 'User ID and Manager ID cannot be the same values!';
  END IF;
  RETURN NEW;
END
$func$;

alter function "Test"() owner to xxxxxx;

如果你的业务规则允许两个字段同时为NULL,不需要额外调整:PostgreSQL中NULL = NULL的判断结果为NULL,不会进入IF分支触发异常。如果需要禁止两个字段同时为NULL,可以修改判断条件为:

IF NEW.id_user = NEW.id_manager OR (NEW.id_user IS NULL AND NEW.id_manager IS NULL) THEN

原有触发器的触发时机、触发条件配置均正确,不需要修改。

内容的提问来源于stack exchange,提问作者Lubos Jansky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 05:06:04