-- 回滚卡轮询优先队列的事实字段补齐与两个新终态,与 up 严格成对,顺序与 up 的创建顺序严格倒序。 -- -- 不可逆说明(ENG-MIG-001 例外条件):本迁移的 down 会删除资产类型与资产ID、设备号快照、 -- 代理归属、尝试上限、执行起止时间、下一次计划执行时间、出队时间、集成交互日志标识与 -- 有效期起算时间等列。这些事实(尤其是「为什么出队、什么时候执行过、上游交互日志标识」) -- 只由本表承载,删除后无法由数据库自身重建,因此 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 status IN ('closed', 'expired') LIMIT 1 ) THEN RAISE EXCEPTION '存在已关闭或已过期的卡轮询优先项,拒绝回滚以避免丢失人工关闭与有效期到期终态事实,请人工核对后向前修复'; END IF; END IF; END $$; DROP INDEX IF EXISTS idx_polling_priority_item_next_run; ALTER TABLE tb_polling_priority_item DROP CONSTRAINT IF EXISTS ck_polling_priority_item_attempt_limit, DROP CONSTRAINT IF EXISTS ck_polling_priority_item_asset, DROP CONSTRAINT IF EXISTS ck_polling_priority_item_asset_type; -- 恢复 000228 的状态约束与终态-结果约束原文。 ALTER TABLE tb_polling_priority_item DROP CONSTRAINT IF EXISTS ck_polling_priority_item_terminal_result; ALTER TABLE tb_polling_priority_item ADD CONSTRAINT ck_polling_priority_item_terminal_result CHECK ( (status = 'completed' AND result = 'success') OR (status = 'failed' AND result = 'failed') OR status IN ('pending', 'processing') ); ALTER TABLE tb_polling_priority_item DROP CONSTRAINT IF EXISTS ck_polling_priority_item_status; ALTER TABLE tb_polling_priority_item ADD CONSTRAINT ck_polling_priority_item_status CHECK (status IN ('pending', 'processing', 'completed', 'failed')); ALTER TABLE tb_polling_priority_item DROP COLUMN IF EXISTS priority_effective_from, DROP COLUMN IF EXISTS integration_log_id, DROP COLUMN IF EXISTS dequeued_at, DROP COLUMN IF EXISTS next_run_at, DROP COLUMN IF EXISTS finished_at, DROP COLUMN IF EXISTS started_at, DROP COLUMN IF EXISTS attempt_limit, DROP COLUMN IF EXISTS agent_shop_id_snapshot, DROP COLUMN IF EXISTS device_no_snapshot, DROP COLUMN IF EXISTS asset_id, DROP COLUMN IF EXISTS asset_type; COMMIT;