-- 回滚卡轮询优先队列:删除 tb_polling_priority_item,与 up 严格成对,顺序与 up 的创建顺序严格倒序。 -- -- 不可逆说明(ENG-MIG-001 例外条件):本迁移的 down 会删除 tb_polling_priority_item。加急事实 -- (触发场景与来源集合、来源订单与套餐使用记录、触发次数、尝试次数、认领时间、人工原因与操作者、 -- 执行结果与失败原因)只由本表承载;tb_audit_event 只记录审计动作与前后值,不能还原完整队列状态, -- 删除后无法由数据库自身重建,因此 down 只在加急事实已无留存需求时执行。 -- -- 守卫一:存在活动项(未软删且待执行/执行中)时拒绝回滚,避免在途加急任务被静默丢弃。 -- 守卫二:存在未终态行(含已软删)时拒绝回滚,避免半终态行随表一起消失、事后无从核对。 BEGIN; DO $$ BEGIN IF to_regclass('tb_polling_priority_item') IS NOT NULL THEN -- 同一事务内先取排他锁再检查并删表,避免检查与删表之间写入新的加急事实。 LOCK TABLE tb_polling_priority_item IN ACCESS EXCLUSIVE MODE; IF EXISTS ( SELECT 1 FROM tb_polling_priority_item WHERE deleted_at IS NULL AND status IN ('pending', 'processing') LIMIT 1 ) THEN RAISE EXCEPTION '存在卡轮询优先队列活动项,拒绝回滚以避免丢失在途加急事实与认领租约状态'; END IF; IF EXISTS ( SELECT 1 FROM tb_polling_priority_item WHERE status IN ('pending', 'processing') LIMIT 1 ) THEN RAISE EXCEPTION '存在未终态的卡轮询优先队列记录(含已软删行),拒绝回滚,请人工核对后向前修复'; END IF; END IF; END $$; DROP INDEX IF EXISTS idx_polling_priority_item_shop_created; DROP INDEX IF EXISTS idx_polling_priority_item_card; DROP INDEX IF EXISTS idx_polling_priority_item_status_created; DROP INDEX IF EXISTS uq_polling_priority_item_active; DROP TABLE IF EXISTS tb_polling_priority_item; COMMIT;