# 水利安监数据库 — 数据迁移方案

## 环境

| | Oracle（源） | 瀚高 PostgreSQL（目标） |
|---|---|---|
| 地址 | 同事本地测试库 | 192.168.0.149:5866/highgo |
| Schema | SLAJ / SLAJ_UPDATE / SLAJ_PERSTEST / SLAJ_ROHS | **slaj**（153张空表已建好） |
| 工具 | ora2pg | psql / \COPY |

---

## 规则

1. **工具**：用 ora2pg 从 Oracle 导出 → PG 导入
2. **主源**：所有表优先从 **SLAJ** schema 取
3. **跳过**：
   - 51 张无 DDL 的表（如 T_SYS_USER、DESU_ROLE 等，表结构待补充）
   - ATT_MED_BASE（1680万行附件表，最后单独处理）
4. **去重**：多源同名表，**列数相同的只迁 SLAJ 一份**；列数不同的才需要合并

---

## 需要合并的表（仅 4 张）

这 4 张表在多个 schema 里列数不同，需从各源取出后按 GUID 去重合并：

| 表名 | 数据源（按列数排序） | 合并优先级 |
|------|---------------------|-----------|
| OBJ_HAZ | SLAJ(46列) > SLAJ_UPDATE(33列) > SLAJ_PERSTEST(31列) | 以 SLAJ 为准，其他 GUID 不存在时补充 |
| OBJ_HIDD | SLAJ_ROHS(32列) > SLAJ(32列) > SLAJ_PERSTEST(30列) | 列数相同，直接取 SLAJ |
| OBJ_ACCI | SLAJ_ROHS(30列) > SLAJ(28列) > SLAJ_PERSTEST(25列) | 以 SLAJ_ROHS 为准 |
| BIS_HIDD_RECT_ACCE | SLAJ_ROHS(16列) > SLAJ(15列) > SLAJ_PERSTEST(12列) | 以 SLAJ_ROHS 为准 |

合并 SQL 模板：
```sql
-- 从多个源合并，按 GUID 去重
INSERT INTO slaj.obj_haz
SELECT DISTINCT ON (guid) * FROM (
  SELECT * FROM oracle_fdw.SLAJ.OBJ_HAZ
  UNION ALL
  SELECT * FROM oracle_fdw.SLAJ_UPDATE.OBJ_HAZ  -- 结构不同，补缺失列
) t;
```

---

## 执行顺序

| 批次 | 内容 | 表数 |
|------|------|------|
| 1 | 基础主数据：ATT_ORG_BASE、ATT_PERS_BASE、ATT_AD_BASE | ~20 |
| 2 | 工程对象：ATT_ENG_*、OBJ_ENG、OBJ_HAZ、OBJ_HIDD 等 | ~40 |
| 3 | 业务表：BIS_*、REL_* | ~80 |
| 4 | 系统配置：SYS_*、COLL_*、IWHR_* | ~10 |
| 5 | 合并那 4 张重复表 | 4 |
| — | 后续补充：51 张无 DDL 表 | — |
| — | 最后：ATT_MED_BASE | 1 |

---

## DDL 脚本

已在瀚高 `slaj` schema 建好 153 张表，全部空表，结构就绪。

如需重新建表：
```bash
psql -h 192.168.0.149 -p 5866 -U highgo -d highgo -f migration/output/schemas/slaj/all.sql
```

完整表清单和每张表的源 schema 见 `migration/output/table-final.json`。
