0035_drop_audit_action_check.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. """删除 sys_audit_log.action_type 的 CHECK 白名单约束。
  2. Revision ID: 0035_drop_audit_action_check
  3. Revises: 0034_role_anchor_self
  4. Create Date: 2026-09-14
  5. 变更要点:
  6. 1. 审计动作是持续扩展的枚举(0009~0031 已重建该约束 8 次),DB CHECK 导致
  7. 新动作写入失败并连带业务操作 500(如库白名单落后于代码时审批单上传失败);
  8. 审计日志作为事实记录不应因枚举扩展而丢失,合法性收敛到应用层字典;
  9. 2. target_type / operation_result 的 CHECK 保留(稳定小枚举,与本次无关);
  10. 3. 模型层同步删除该 CheckConstraint(dms/models/audit_log.py,新装库不再创建)。
  11. """
  12. from __future__ import annotations
  13. from collections.abc import Sequence
  14. import sqlalchemy as sa
  15. from alembic import op
  16. revision: str = "0035_drop_audit_action_check"
  17. down_revision: str | None = "0034_role_anchor_self"
  18. branch_labels: str | Sequence[str] | None = None
  19. depends_on: str | Sequence[str] | None = None
  20. # 与 0026 一致:op.drop_constraint 按 naming convention 前缀化约束名,
  21. # 传原始名渲染最终名;线性链上 0026 已把约束统一为渲染名。
  22. _ACTION_CONSTRAINT = "audit_action_type"
  23. def _existing_check_names() -> set[str]:
  24. return {
  25. item["name"].lower()
  26. for item in sa.inspect(op.get_bind()).get_check_constraints("sys_audit_log")
  27. }
  28. def upgrade() -> None:
  29. if f"ck_sys_audit_log_{_ACTION_CONSTRAINT}" in _existing_check_names():
  30. op.drop_constraint(_ACTION_CONSTRAINT, "sys_audit_log", type_="check")
  31. def downgrade() -> None:
  32. raise RuntimeError(
  33. "0035降级需按当时动作全集重建 CHECK 白名单,且库中不得存在白名单外"
  34. "action_type 记录;如确需恢复约束请人工评估后执行"
  35. )