# Schema迁移脚本使用指南

> **版本：** V1.0  
> **创建日期：** 2025-11-09  
> **迁移目标：** 从public schema迁移到10个隔离Schema

---

## 📋 脚本清单

| # | 脚本名称 | 说明 | 预计时间 | 前置依赖 |
|---|---------|------|---------|---------|
| 1 | `001-create-all-10-schemas.sql` | 创建10个Schema（3详细+7空） | 5秒 | 无 |
| 2 | `002-migrate-platform.sql` | 迁移platform_schema（1个表：users） | 15分钟 | 001 |
| 3 | `003-migrate-aia.sql` | 迁移aia_schema（5个表：对话相关） | 30分钟 | 001, 002 |
| 4 | `004-migrate-pkb.sql` | 迁移pkb_schema（5个表：知识库相关） | 30分钟 | 001, 002 |
| 5 | `005-validate-all.sql` | 全局验证和数据完整性检查 | 10分钟 | 001-004 |

**总计：** 约1.5小时

---

## 🚀 执行步骤

### 前置准备

1. **备份数据库（强烈建议）**
   ```bash
   pg_dump -U postgres -d your_database > backup_$(date +%Y%m%d_%H%M%S).sql
   ```

2. **确认数据库连接**
   ```bash
   # 确保DATABASE_URL环境变量正确
   echo $DATABASE_URL
   # 或查看 .env 文件
   ```

3. **确认当前表结构**
   ```sql
   SELECT tablename FROM pg_tables WHERE schemaname = 'public';
   ```

---

### 执行迁移

#### 方法1：使用psql命令（推荐）

```bash
# 进入脚本目录
cd AIclinicalresearch/docs/09-架构实施/migration-scripts

# 依次执行脚本
psql $DATABASE_URL -f 001-create-all-10-schemas.sql
psql $DATABASE_URL -f 002-migrate-platform.sql
psql $DATABASE_URL -f 003-migrate-aia.sql
psql $DATABASE_URL -f 004-migrate-pkb.sql
psql $DATABASE_URL -f 005-validate-all.sql
```

#### 方法2：一次性执行所有脚本

```bash
# 创建执行脚本
cat 001-create-all-10-schemas.sql \
    002-migrate-platform.sql \
    003-migrate-aia.sql \
    004-migrate-pkb.sql \
    005-validate-all.sql \
    | psql $DATABASE_URL
```

#### 方法3：使用数据库客户端（如DBeaver、pgAdmin）

1. 打开数据库客户端
2. 连接到目标数据库
3. 依次打开并执行每个SQL文件

---

## ✅ 验证清单

### 执行001后

- [ ] 10个Schema全部创建成功
- [ ] 每个Schema都有注释说明

```sql
-- 验证SQL
SELECT nspname, pg_catalog.obj_description(oid, 'pg_namespace')
FROM pg_namespace
WHERE nspname LIKE '%_schema'
ORDER BY nspname;
```

### 执行002后

- [ ] platform_schema.users表创建成功
- [ ] 数据从public.users完整迁移
- [ ] 4个索引创建成功

```sql
-- 验证SQL
SELECT COUNT(*) AS public_count FROM public.users;
SELECT COUNT(*) AS platform_count FROM platform_schema.users;
```

### 执行003后

- [ ] aia_schema的5个表创建成功
- [ ] 数据完整迁移
- [ ] 外键约束正确建立

```sql
-- 验证SQL
SELECT COUNT(*) FROM aia_schema.projects;
SELECT COUNT(*) FROM aia_schema.conversations;
```

### 执行004后

- [ ] pkb_schema的5个表创建成功
- [ ] 包含Phase 2全文阅读字段
- [ ] 数据完整迁移

```sql
-- 验证SQL
SELECT COUNT(*) FROM pkb_schema.knowledge_bases;
SELECT COUNT(*) FROM pkb_schema.documents;
```

### 执行005后

- [ ] 所有数据量对比一致
- [ ] 跨Schema外键引用有效
- [ ] 无数据丢失

---

## 📊 迁移后数据分布

### Platform Schema
```
platform_schema
└── users (1表)
```

### AIA Schema
```
aia_schema
├── projects
├── conversations
├── messages
├── general_conversations
└── general_messages (5表)
```

### PKB Schema
```
pkb_schema
├── knowledge_bases
├── documents
├── batch_tasks
├── batch_results
└── task_templates (5表)
```

### 空Schema（7个）
```
asl_schema      (AI智能文献 - Week 3设计)
common_schema   (通用能力层)
dc_schema       (数据清洗)
rvw_schema      (审稿系统)
admin_schema    (运营管理)
ssa_schema      (智能统计分析)
st_schema       (统计分析工具)
```

---

## ⚠️ 注意事项

### 1. 事务保护

所有迁移脚本都使用了事务（BEGIN/COMMIT）：
- 成功：全部提交
- 失败：自动回滚，无部分迁移

### 2. 幂等性

所有脚本支持重复执行：
- 使用 `IF NOT EXISTS` 创建对象
- 使用 `ON CONFLICT DO NOTHING` 插入数据

### 3. public schema保留

迁移后**不会删除** public schema中的原表：
- 原因：方便回滚和对比验证
- 清理：待所有验证通过后，再决定是否删除

### 4. 外键约束

支持跨Schema外键：
- 所有业务表引用 `platform_schema.users(id)`
- PostgreSQL原生支持，无需特殊配置

---

## 🔧 故障排查

### 问题1：连接被拒绝

**错误：** `connection refused`

**解决：**
```bash
# 检查PostgreSQL服务
sudo systemctl status postgresql

# 启动服务
sudo systemctl start postgresql
```

### 问题2：权限不足

**错误：** `permission denied to create schema`

**解决：**
```sql
-- 授予权限
GRANT CREATE ON DATABASE your_database TO your_user;
```

### 问题3：外键约束失败

**错误：** `violates foreign key constraint`

**解决：**
- 确保先执行 002（platform）再执行 003/004（aia/pkb）
- 检查是否有孤立的user_id

### 问题4：数据量不一致

**错误：** 验证脚本报告数据量不一致

**解决：**
1. 检查是否有迁移过程中新增的数据
2. 使用ID对比检查具体差异：
   ```sql
   -- 找出差异的ID
   SELECT id FROM public.users
   EXCEPT
   SELECT id FROM platform_schema.users;
   ```

---

## 📝 回滚方案

### 快速回滚（推荐）

```sql
-- 删除所有新建的Schema（会级联删除所有表和数据）
DROP SCHEMA IF EXISTS platform_schema CASCADE;
DROP SCHEMA IF EXISTS aia_schema CASCADE;
DROP SCHEMA IF EXISTS pkb_schema CASCADE;
DROP SCHEMA IF EXISTS asl_schema CASCADE;
DROP SCHEMA IF EXISTS common_schema CASCADE;
DROP SCHEMA IF EXISTS dc_schema CASCADE;
DROP SCHEMA IF EXISTS rvw_schema CASCADE;
DROP SCHEMA IF EXISTS admin_schema CASCADE;
DROP SCHEMA IF EXISTS ssa_schema CASCADE;
DROP SCHEMA IF EXISTS st_schema CASCADE;
```

### 从备份恢复

```bash
# 恢复备份
psql $DATABASE_URL < backup_20251109_100000.sql
```

---

## 📂 后续步骤

迁移完成后，需要：

1. **更新Prisma配置** → 见任务9
   - 更新 `backend/prisma/schema.prisma`
   - 添加 `multiSchema` 预览特性
   - 为3个Schema定义模型

2. **生成Prisma Client**
   ```bash
   cd backend
   npx prisma generate
   ```

3. **更新代码** → 见任务12
   - 所有数据库查询使用新Schema
   - 测试现有功能

4. **运行测试** → 见任务8
   - 测试AI智能问答
   - 测试知识库功能

---

## 📞 获取帮助

如果遇到问题：

1. **查看日志** - psql会输出详细的执行信息和错误
2. **检查文档** - 参考 `09-架构实施/01-Schema隔离架构设计（10个）.md`
3. **验证数据** - 运行 `005-validate-all.sql`

---

**创建人：** AI助手  
**最后更新：** 2025-11-09  
**版本：** V1.0

**核心理念：可重复执行 + 事务保护 + 完整验证 = 安全迁移** ⭐⭐⭐
