Files
opsxsql/backend/app/models/ticket.py
T
logan f6f9142ce8 feat: Phase2影响分析 — EXPLAIN预检+大表检测(简化版)+执行策略+风险评估table_sizes支持 (1141测试)
新增:
- explain_preview.py: EXPLAIN预检服务(MySQL/PG), 影响行数预估, 全表扫描检测
- ticket.executor: 三种执行策略(stop_on_error/continue/transaction)
- risk_evaluator: table_sizes参数, 大表ALTER/UPDATE/DELETE自动升级high
- test_phase2_features.py: 22个测试(EXPLAIN+执行策略+大表检测)

简化:
- 砍掉CTX-001上下文感知规则(复杂二次扫描), 合并大表检测到risk_evaluator
- 审核引擎保持纯静态分析, 不再导入_RULE_REGISTRY做二次扫描

模型:
- Ticket加exec_strategy字段
- TicketSqlItem模型
- schema加sql_type/exec_strategy/risk_level/workflow_id
2026-05-25 11:02:51 +08:00

32 lines
1.8 KiB
Python

from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, func
from app.core.database import Base
class Ticket(Base):
__tablename__ = "tickets"
id = Column(Integer, primary_key=True, autoincrement=True)
ticket_no = Column(String(20), unique=True, nullable=True, comment="工单编号,格式: 20260522160543841")
title = Column(String(200), nullable=False)
db_type = Column(String(20), nullable=False)
instance_id = Column(Integer, ForeignKey("instances.id"), nullable=False)
target_database = Column(String(100), nullable=False)
sql_content = Column(Text, nullable=False)
rollback_sql = Column(Text, nullable=True)
status = Column(String(20), default="pending") # pending / reviewing / approved / rejected / executing / success / failed
priority = Column(String(10), default="medium") # high / medium / low
risk_level = Column(String(20), default="low", comment="自动风险等级: low/medium/high/critical")
workflow_id = Column(Integer, ForeignKey("workflow_definitions.id"), nullable=True, comment="关联审批流")
exec_strategy = Column(String(20), default="stop_on_error", comment="执行策略: stop_on_error/continue/transaction")
applicant_id = Column(Integer, ForeignKey("users.id"), nullable=False)
approver_id = Column(Integer, ForeignKey("users.id"), nullable=True)
reason = Column(Text, nullable=True)
audit_result = Column(Text, nullable=True)
execute_result = Column(Text, nullable=True)
create_time = Column(DateTime, server_default=func.now())
review_time = Column(DateTime, nullable=True)
execute_time = Column(DateTime, nullable=True)
scheduled_at = Column(DateTime, nullable=True, comment="定时执行时间,NULL=立即执行")
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())