PostgreSQL用触发器阻止lamtapproved列更新不生效问题求助
现有触发器逻辑的问题
核心问题是判断条件逻辑完全写反:
- 原有逻辑的
if new.lamtapproved=old.lamtapproved判定的是lamtapproved字段没有发生修改的场景,只有字段未被修改时才会抛出异常,反而字段被主动修改时不会触发拦截,自然达不到禁止更新的效果。 - 额外需要注意:如果触发器的触发事件、绑定表配置错误,也会导致拦截失效。
修正方案
1. 修正触发器函数逻辑
把判断条件调整为检测字段是否发生变更,只要发生变更就抛出异常:
create or replace function Prevent_update() returns trigger as $$ begin -- 检测lamtapproved字段是否被修改 if new.lamtapproved <> old.lamtapproved then raise exception '不允许更新lamtapproved列'; end if; return new; end; $$ language plpgsql;
如果lamtapproved字段允许为NULL,
=/<>对NULL的判断会失效,建议用IS DISTINCT FROM语法兼容NULL场景:if new.lamtapproved IS DISTINCT FROM old.lamtapproved
2. 确认触发器绑定配置正确
需要保证触发器绑定到目标表、且仅在更新对应字段时触发,示例绑定语句:
CREATE TRIGGER trg_prevent_lamtapproved_update BEFORE UPDATE OF lamtapproved -- 仅更新lamtapproved列时才触发触发器,性能更优 ON 你的实际表名 -- 替换为你要操作的业务表名 FOR EACH ROW EXECUTE FUNCTION Prevent_update();
配置完成后,所有尝试修改lamtapproved列的更新操作都会被直接拦截并抛出异常。
内容的提问来源于stack exchange,提问作者Suraj Paswan
相关产品推荐
相关产品推荐

