必须用 BEFORE INSERT OR UPDATE。它在数据落盘前执行,可通过 RAISE EXCEPTION 或 SIGNAL 中断事务,确保脏数据不写入;AFTER INSERT 已无法回滚,强一致性被破坏。触发器里用 AFTER INSERT 还是 BEFORE INSERT?BEFORE INSERT 是唯一能真正阻止脏数据写入的时机。它在数据落盘前执行,一旦触发器抛出异常(比如 RAISE EXCEPTION),整个事务就会回滚;而 AFTER INSERT 已经写进表了,再报错也晚了------脏数据已存在,只能靠后续清理,强一致性就破了。PostgreSQL 中必须用 BEFORE INSERT OR UPDATE,配合 RAISE EXCEPTIONMySQL 的 BEFORE INSERT 可以用 SIGNAL SQLSTATE '45000' 中断SQL Server 的 INSTEAD OF INSERT 也能拦截,但逻辑要自己重写插入动作,容易漏字段校验逻辑写在触发器里,为什么常出现性能崩塌?触发器不是"加个 if 就完事"。每次插入都执行全量校验逻辑,如果里面包含子查询、JOIN 或调用函数,会迅速拖垮吞吐量。避免在触发器里查大表:比如校验用户状态时去 users 表查 is_active = true,不如把必要字段冗余到当前表或用缓存键值对不要调用外部 API 或执行文件 I/O ------ 触发器必须是纯数据库内操作PostgreSQL 中慎用 EXECUTE 动态 SQL,解析开销高,且无法被计划器优化示例(PostgreSQL):CREATE OR REPLACE FUNCTION check_order_amount() RETURNS TRIGGER AS BEGIN IF NEW.amount \<= 0 THEN RAISE EXCEPTION 'amount must be positive'; END IF; IF (SELECT COUNT(\*) FROM orders WHERE user_id = NEW.user_id) \> 100 THEN RAISE EXCEPTION 'user % exceeded order limit', NEW.user_id; END IF; RETURN NEW;END; LANGUAGE plpgsql;第二条 SELECT COUNT(*) 就是典型隐患:每插一条都扫一遍该用户的全部订单。 知网AI智能写作 知网AI智能写作,写文档、写报告如此简单
相关推荐
luckdewei3 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化aqi009 小时前
15天学会AI应用开发(八)使用向量数据库实现RAG功能Csvn10 小时前
`functools.lru_cache` —— 一行代码搞定缓存加速金銀銅鐵1 天前
[Python] 从《千字文》中随机挑选汉字cup111 天前
[技术复盘] Windows Python 打包实战:Nuitka 环境踩坑总结与 CI 自动化构建全指南aqi001 天前
15天学会AI应用开发(七)有了大模型为什么还要引入RAG金銀銅鐵1 天前
用 Python 实现 Take-Away 游戏copyer_xyf1 天前
Agent 流程编排