新增功能:
- ticket_sql_items模型: 逐条SQL执行记录(状态/耗时/影响行数)
- risk_evaluator.py: 4级风险评估(low/medium/high/critical), 支持MySQL/PG/Redis/Mongo
- Ticket模型: 新增risk_level + workflow_id字段
- 审核引擎签名改造: audit(sql, db_type, instance_id=None) 支持EXPLAIN预检
- 审核超时保护: 10s超时跳过审核, 防止工单创建阻塞
- 工单创建自动风险计算 + 审批流匹配(instance.workflow_id优先)
- SQL items查询API: GET /{ticket_id}/sql-items 含进度统计
- 执行器集成: 执行完成后自动更新SQL items逐条状态
- 通知脱敏: password/secret/token自动掩码, SQL预览截断100字符
- 高危操作强制二次确认: high/critical级别需confirmed=true
- 维护窗口控制: system_settings配置执行时间窗口(支持跨午夜)
- 45个新测试: 风险评估24+通知脱敏5+维护窗口2+SQL分类11+配置2
31 lines
1.7 KiB
Python
31 lines
1.7 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="关联审批流")
|
|
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())
|