# SQL 上线操作手册

本目录统一存放数据库相关 SQL。

目标不是只告诉你“文件在哪”，而是让开发、DBA、运维拿到后可以直接按顺序执行、验收、排查。

## 目录约定

- `schema_*`：建表、补字段、补索引、结构补丁
- `seed_*`：初始化数据、菜单、权限、路由种子
- `precheck_*`：正式迁移/删表前的只读巡检脚本
- `migrate_*`：数据迁移、历史结构升级
- `*_patch.sql`：补丁脚本
- `*_audit.sql`：审计/巡检类脚本

## 通用执行规范

### 1. 推荐命令

生产执行时统一带 `ON_ERROR_STOP=1`：

```bash
psql -h <host> -U <user> -d <db_name> -v ON_ERROR_STOP=1 -f scripts/创建sql/<file>.sql
```

### 2. 执行前要求

- 先确认目标库是测试库、预发库还是正式库
- 先备份，尤其是 `schema_*` 和 `migrate_*`
- 先看脚本头部注释，确认依赖关系
- 先跑 `precheck_*`，再跑 `migrate_*`
- 生产环境优先按“单脚本执行 -> 验收 -> 下一步”推进，不要一把梭

### 3. 执行后要求

- 记录执行人、执行时间、执行环境
- 保存关键查询结果或截图
- 若脚本涉及后端新接口，执行后重启对应服务

## 快速场景索引

### 新环境最小起步

1. `user_rbac_schema_patch.sql`
2. `user_rbac_seed.sql`
3. `schema_v2_add_evaluation_tables.sql`
4. `seed_home_entry_modules.sql`

### 系统使用统计上线

1. `schema_add_usage_stats.sql`
2. `seed_usage_stats_rbac.sql`

### 评查点分组迁移

1. `precheck_rule_group_migration.sql`
2. `migrate_rule_groups_to_business_roots.sql`
3. `seed_rule_groups_rbac.sql`
4. `seed_evaluation_points_rbac.sql`

### 交叉评查一期上线

1. `schema_v3_add_cross_review_phase1.sql`
2. `seed_cross_review_phase1_permissions.sql`

### RAG 能力上线

1. `schema_add_rag_chat.sql`
2. 视环境决定是否补跑 `user_rbac_seed.sql`

## 按模块说明

### 一、系统使用统计

- `schema_add_usage_stats.sql`
  - 用途：补齐系统使用统计需要的库结构
  - 主要内容：新增 `usage_login_events`、给 `sso_users` 增加 `last_login_at`、补 `leaudit_audit_runs.trigger_user_id` 统计索引
  - 执行时机：上线“系统使用统计”接口前必跑

- `seed_usage_stats_rbac.sql`
  - 用途：补齐“系统使用统计”菜单、权限点、角色授权
  - 主要内容：新增 `/usage-stats` 路由、`usage_stats:*` 权限、给 `super_admin` / `provincial_admin` / `admin` 赋权
  - 执行时机：库结构完成后执行

#### 上线顺序

1. `schema_add_usage_stats.sql`
2. `seed_usage_stats_rbac.sql`

#### 标准执行命令

```bash
psql -h <host> -U <user> -d <db_name> -v ON_ERROR_STOP=1 -f scripts/创建sql/schema_add_usage_stats.sql
psql -h <host> -U <user> -d <db_name> -v ON_ERROR_STOP=1 -f scripts/创建sql/seed_usage_stats_rbac.sql
```

#### 执行后验收

```sql
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'sso_users'
  AND column_name = 'last_login_at';

SELECT to_regclass('public.usage_login_events');

SELECT route_path, route_title
FROM sys_routes
WHERE route_path = '/usage-stats'
  AND deleted_at IS NULL;

SELECT permission_key
FROM permissions
WHERE permission_key LIKE 'usage_stats:%'
ORDER BY permission_key;
```

#### 业务验证

- 管理员登录一次，检查 `usage_login_events`
- 上传一个文档，检查上传统计是否可计数
- 发起一次评查，检查 `leaudit_audit_runs.trigger_user_id`
- 用地区管理员账号访问统计接口，确认只能看到本地区数据

#### 失败排查

- `schema_add_usage_stats.sql` 失败：先停，不要继续跑 seed
- `seed_usage_stats_rbac.sql` 失败：先查 `/settings` 路由、`roles` 是否存在
- 统计接口 500：重点检查 `sso_users`、`leaudit_audit_runs`、`usage_login_events`

### 二、用户 / RBAC / 地区权限

- `user_rbac_schema_patch.sql`
  - 用途：补齐用户、角色、权限、路由核心表结构
  - 场景：新库初始化或旧库尚未具备 RBAC 基础表时

- `user_rbac_seed.sql`
  - 用途：初始化基础角色、权限、路由种子
  - 依赖：`user_rbac_schema_patch.sql`

- `user_rbac_comments_patch.sql`
  - 用途：补充 RBAC 相关表和字段中文注释

- `user_rbac_migration_audit.sql`
  - 用途：老系统迁移前数据审计
  - 场景：检查空地区、脏角色、重复账号、无角色用户等风险

#### 常见顺序

1. `user_rbac_schema_patch.sql`
2. `user_rbac_seed.sql`
3. `user_rbac_comments_patch.sql`
4. `user_rbac_migration_audit.sql`

### 三、首页入口 / 文档类型 / 前端路由

- `schema_v2_add_evaluation_tables.sql`
  - 用途：补充入口模块、文档类型及相关结构

- `seed_home_entry_modules.sql`
  - 用途：初始化首页入口模块并绑定既有文档类型

- `seed_frontend_route_scope.sql`
  - 用途：补齐前端真实菜单树仍需暴露的路由范围

#### 常见顺序

1. `schema_v2_add_evaluation_tables.sql`
2. `seed_home_entry_modules.sql`
3. `seed_frontend_route_scope.sql`

### 四、评查点分组迁移

- `precheck_rule_group_migration.sql`
  - 用途：正式迁移前巡检当前分组树、规则集绑定、入口模块映射
  - 特点：只读，不改数据

- `migrate_rule_groups_to_business_roots.sql`
  - 用途：按“业务大类根”做正式迁移
  - 说明：当前正式迁移入口脚本

- `migrate_rule_groups_to_doc_type_roots.sql`
  - 用途：历史草案保留
  - 说明：已废弃，仅兼容历史引用，请改用 `migrate_rule_groups_to_business_roots.sql`

- `seed_rule_groups_rbac.sql`
  - 用途：补齐评查点分组页面与接口的 RBAC 权限

- `seed_evaluation_points_rbac.sql`
  - 用途：补齐规则/评查点相关权限点

#### 推荐顺序

1. `precheck_rule_group_migration.sql`
2. `migrate_rule_groups_to_business_roots.sql`
3. `seed_rule_groups_rbac.sql`
4. `seed_evaluation_points_rbac.sql`

#### 操作建议

- 先在测试库做全量演练
- 先导出旧表备份
- 迁移完成后重点验收：文档类型绑定页、规则组页、上传页、评查执行链路

### 五、旧绑定下线检查

- `precheck_drop_legacy_rule_type_bindings.sql`
  - 用途：删除 `leaudit_rule_type_bindings` 前做覆盖率和风险检查
  - 特点：只读，不删除数据

### 六、交叉评查

- `schema_v3_add_cross_review_phase1.sql`
  - 用途：交叉评查第一阶段表结构

- `seed_cross_review_phase1_permissions.sql`
  - 用途：交叉评查第一阶段权限种子

#### 推荐顺序

1. `schema_v3_add_cross_review_phase1.sql`
2. `seed_cross_review_phase1_permissions.sql`

### 七、RAG

- `schema_add_rag_chat.sql`
  - 用途：RAG 数据集、会话等相关结构初始化/补充
  - 说明：若环境还没补齐 RBAC 菜单/权限，联动检查 `user_rbac_seed.sql`

### 八、文档版本管理

- `migrate_20260429_document_versioning.sql`
  - 用途：给 `leaudit_documents` 补齐版本归档能力
  - 主要内容：增加版本链字段、归一化名称、历史数据回填

## 生产环境最小执行清单

### 通用模板

1. 确认目标库
2. 备份
3. 跑 `precheck_*` 或确认依赖
4. 执行 1 个脚本
5. 做 1 轮验收
6. 再执行下一个脚本
7. 重启相关服务
8. 做接口与业务验证

### 系统使用统计模板

1. 备份 `sso_users`、`sys_routes`、`permissions`、`role_permissions`、`role_route`、`leaudit_audit_runs`
2. 执行 `schema_add_usage_stats.sql`
3. 执行结构验收 SQL
4. 执行 `seed_usage_stats_rbac.sql`
5. 执行菜单/权限验收 SQL
6. 重启后端服务
7. 登录一次、上传一次、评查一次
8. 用超级管理员和地区管理员分别验证接口返回范围

## 维护规则

- 新增 SQL 一律放 `scripts/创建sql/`
- 新增脚本时同步补本 README
- 若脚本执行顺序变化，优先更新这里，再更新业务文档
- 若脚本已废弃，保留文件时必须在头部写明“已废弃”和替代脚本
