新增: - 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
32 lines
1.8 KiB
Python
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())
|