0037_drop_audit_target_check.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. """删除 sys_audit_log.target_type 的 CHECK 白名单约束。
  2. Revision ID: 0037_drop_audit_target_check
  3. Revises: 0036_notification
  4. Create Date: 2026-09-16
  5. 变更要点:
  6. 1. 借阅审批流(契约1.37,Java版)新增审计对象类型 BORROW_REQUEST,库内
  7. target_type CHECK 白名单未同步,借阅审计写入违约并连带业务操作 500;
  8. 2. 与 0035 对 action_type 的处理同理:审计对象类型同为持续扩展的枚举
  9. (0029 已加 SYSTEM、1.37 又纳入 BORROW_REQUEST),DB CHECK 导致审计
  10. 事实记录因枚举扩展而丢失,合法性收敛到应用层字典;
  11. 3. operation_result 的 CHECK 保留(SUCCESS/FAILURE 二值稳定枚举);
  12. 4. 模型层同步删除该 CheckConstraint(dms/models/audit_log.py,新装库不再创建)。
  13. """
  14. from __future__ import annotations
  15. from collections.abc import Sequence
  16. import sqlalchemy as sa
  17. from alembic import op
  18. revision: str = "0037_drop_audit_target_check"
  19. down_revision: str | None = "0036_notification"
  20. branch_labels: str | Sequence[str] | None = None
  21. depends_on: str | Sequence[str] | None = None
  22. # 与 0035 一致:op.drop_constraint 按 naming convention 前缀化约束名,
  23. # 传原始名渲染最终名(ck_sys_audit_log_audit_target_type)。
  24. _TARGET_CONSTRAINT = "audit_target_type"
  25. def _existing_check_names() -> set[str]:
  26. return {
  27. item["name"].lower()
  28. for item in sa.inspect(op.get_bind()).get_check_constraints("sys_audit_log")
  29. }
  30. def upgrade() -> None:
  31. if f"ck_sys_audit_log_{_TARGET_CONSTRAINT}" in _existing_check_names():
  32. op.drop_constraint(_TARGET_CONSTRAINT, "sys_audit_log", type_="check")
  33. def downgrade() -> None:
  34. raise RuntimeError(
  35. "0037降级需按当时对象类型全集重建 CHECK 白名单,且库中不得存在白名单外"
  36. "target_type 记录;如确需恢复约束请人工评估后执行"
  37. )