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

触发器未按预期执行:禁止用户评论自身发布内容的问题排查

问题分析与修复方案

核心逻辑错误

你的触发器函数里的EXISTS查询完全偏离了需求:

  • 当前查询是拿已存在评论的发布者和目标文章的发布者做对比,而非拿要插入的新评论的发布者(NEW.publisherID)与文章发布者对比。
  • 第一个子查询关联comment表完全多余——新评论还未插入到comment表中,这个子查询只会查到其他用户的评论发布者,根本无法触发你想要的限制规则。

修复后的函数代码

CREATE OR REPLACE FUNCTION not_comment() RETURNS TRIGGER AS 
$BODY$ 
BEGIN 
    -- 检查当前评论的发布者是否等于对应文章的发布者
    IF EXISTS (
        SELECT 1
        FROM article
        JOIN post USING (postID)
        WHERE article.articleID = NEW.articleID
          AND article.publisherID = NEW.publisherID
    ) THEN
        RAISE EXCEPTION '用户不能评论自己发布的文章'; 
    END IF; 
    RETURN NEW; 
END 
$BODY$ 
LANGUAGE plpgsql; 

触发器代码无需调整

原触发器语法正确,保持即可:

CREATE TRIGGER not_comment 
      BEFORE INSERT ON comment
      FOR EACH ROW 
      EXECUTE PROCEDURE not_comment(); 

额外优化建议

  1. 错误提示修正:原英文提示存在语法问题,改用中文提示更清晰;若需英文,可调整为'A user cannot comment on an article they published'。
  2. 查询效率优化:给article(articleID, publisherID)和post(postID)建立复合索引,提升触发时的查询速度。

内容的提问来源于stack exchange,提问作者Pedro Barbeira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:10:33