触发器未按预期执行:禁止用户评论自身发布内容的问题排查
问题分析与修复方案
核心逻辑错误
你的触发器函数里的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();
额外优化建议
- 错误提示修正:原英文提示存在语法问题,改用中文提示更清晰;若需英文,可调整为
'A user cannot comment on an article they published'。 - 查询效率优化:给
article(articleID, publisherID)和post(postID)建立复合索引,提升触发时的查询速度。
内容的提问来源于stack exchange,提问作者Pedro Barbeira
相关产品推荐
相关产品推荐

