PostgreSQL:事务提交前执行租户发票地址校验逻辑需求
事务提交前的动态数据校验需求
涉及的数据表
tenants表
tenantId(UUID):租户唯一标识invoiceAddress(TEXT):租户发票地址
packages表
packageId:套餐唯一标识needsInvoice:标识套餐是否需要开具发票(布尔类型)
tenants_and_packages表(租户与套餐的多对多关联表)
tenantsAndPackagesId:关联记录唯一标识tenantId:关联的租户IDpackageId:关联的套餐ID
校验规则与场景限制
需要实现的校验逻辑:当插入或更新租户、套餐数据时,需依据packages表的needsInvoice字段,判断租户是否必须填写invoiceAddress——只要租户关联的任意套餐的needsInvoice为true,该租户的invoiceAddress就不能为空。
所有操作均在迁移事务上下文执行,存在以下场景:仅修改租户数据、仅修改套餐数据、同一事务内连续修改租户和套餐数据。因此校验必须延迟到事务即将提交(commit)前执行:例如先修改租户清空其invoiceAddress,后续在同一事务中将该租户关联套餐的needsInvoice改为false,若在租户修改后立即执行校验会直接终止事务,但最终事务提交后的状态是合法的,所以必须在提交前统一校验最终状态。
已知常规数据库约束不支持子查询或动态逻辑,无法满足该需求;行级触发器(在插入/更新行前后触发)也无法适配这种跨事务步骤的校验场景。
内容的提问来源于stack exchange,提问作者Woodpecker
相关产品推荐
相关产品推荐

