以下是使用 **DBeaver 企业版** 将 SQL Server 数据库迁移至达梦 DM8 的详细步骤。相较于社区版,企业版通过内置的 **跨数据库传输工具** 简化了大部分操作,但仍需注意语法和数据类型差异的适配。
---
### **一、准备工作**
1. **安装与激活**
- 确保已安装 [DBeaver 企业版](https://dbeaver.com/) 并激活。
- 企业版提供 **数据传输(Data Transfer)** 功能(社区版无此跨库功能)。
2. **驱动配置**
- **SQL Server 驱动**:默认已集成。
- **达梦 DM8 驱动**:
- 从达梦官网下载 [JDBC 驱动(DmJdbcDriver18.jar)](https://eco.dameng.com/document/dm/zh-cn/start/jdbc.html)。
- 在 DBeaver 中配置驱动:
- 打开 **数据库 > 驱动管理器 > 新建驱动**。
- 添加 JAR 文件,设置驱动类名 `dm.jdbc.driver.DmDriver`,URL 模板:`jdbc:dm://{host}:{port}/{database}`。

3. **连接数据库**
- 创建 SQL Server 和 DM8 的连接,确保能正常访问双方数据库。
- 目标端需提前在 DM8 中创建空库(如 `migrated_db`)。
---
### **二、迁移表结构与数据**
#### **1. 启动数据传输工具**
- 右键 SQL Server 数据库 > **工具 > 数据传输**。

#### **2. 配置源与目标**
- **源(Source)**:选择 SQL Server 数据库及待迁移的表、视图等对象。
- **目标(Target)**:选择 DM8 数据库及目标模式。
- **映射选项**:
- **自动创建目标表**:勾选以自动生成表结构。
- **删除目标表**:若需覆盖已有表,可勾选“Truncate”或“Drop”。

#### **3. 数据类型与字段映射**
- 点击 **列映射**,检查字段类型是否自动匹配。常见需手动调整的映射:
- `DATETIME` → `DATE`
- `NVARCHAR` → `NVARCHAR2`
- `TEXT` → `CLOB`
- `VARBINARY(MAX)` → `BLOB`

#### **4. 执行迁移**
- **预检查**:点击 **Validate** 检查迁移配置是否合理。
- **运行迁移**:点击 **Start**,DBeaver 将自动执行以下操作:
1. 提取 SQL Server 的表结构(DDL)。
2. 在 DM8 中创建表(自动转换适配语法)。
3. 批量导出 SQL Server 数据并导入 DM8。

#### **5. 错误处理**
- 若迁移失败,检查 **Error Log** 中的具体原因:
- **常见错误**:
- 未适配的自增列语法:需手动修改为 `GENERATED ALWAYS AS IDENTITY`。
- 函数不兼容(如 `GETDATE()`):需替换为 `SYSDATE`。
- **解决方法**:
- 手动调整后重新运行迁移。
- 忽略错误表,迁移完成后单独处理。
---
### **三、迁移其他对象**
#### **1. 视图、存储过程、函数**
- DBeaver 的数据传输工具主要针对表和数据,以下对象需手动迁移:
1. **导出 SQL Server 对象源码**:
- 右键对象(如存储过程) > **生成 SQL**。
2. **适配 DM8 语法**:
- 替换 T-SQL 语法为达梦兼容的 PL/SQL(示例见下文)。
3. **在 DM8 中执行**:
- 使用 SQL 编辑器直接运行适配后的脚本。
**示例:存储过程转换**
```sql
-- SQL Server 原始代码
CREATE PROCEDURE GetUserCount
AS
BEGIN
SELECT COUNT(*) FROM Users;
END;
-- 达梦 DM8 适配后
CREATE OR REPLACE PROCEDURE GetUserCount
AS
BEGIN
SELECT COUNT(*) FROM Users;
END;
```
#### **2. 索引与约束**
- 如果 DBeaver 自动生成的表结构中未包含索引或约束:
1. 导出 SQL Server 的索引 DDL。
2. 手动在 DM8 中执行 `CREATE INDEX` 语句。
---
### **四、迁移后验证**
1. **数据一致性检查**
- 使用 **数据对比工具**(DBeaver 企业版功能):
- 右键数据库 > **工具 > 数据比较**,选择源和目标表,检查差异。

2. **性能与功能验证**
- **基本查询**:执行 `SELECT` 语句验证结果是否一致。
- **事务测试**:插入/更新数据并提交,确认事务生效。
- **错误日志监控**:关注 DM8 的 `$DMDBA/dmdbms/log` 目录下的日志文件。
---
### **五、注意事项**
1. **数据类型兼容性**
- SQL Server 的 `TEXT`、`NTEXT` 需转为 `CLOB`。
- `DATETIME2` 需显式指定精度(如 `DATETIME(6)`)。
2. **自增列处理**
- 确保迁移后的表自增列定义为 `GENERATED ALWAYS AS IDENTITY`,而非 SQL Server 的 `IDENTITY`。
3. **批量提交优化**
- 在大数据量迁移时,调整 **数据传输设置**:
- **Batch Size**:从默认 1000 调整为 5000(减少提交次数)。
- **Use Multi-Row INSERT**:启用以提升插入效率。
4. **字符集问题**
- 若 SQL Server 使用 `UTF-8`,需确保 DM8 数据库建库时指定兼容字符集。
5. **使用达梦官方工具辅助**
- 若 DBeaver 迁移复杂对象(如存储过程)效率低,可配合使用达梦 **DTS 工具** 进行二次迁移。
---
### **六、替代方案(达梦 DTS 工具)**
如果数据量过大或对象复杂,可直接使用 **达梦官方迁移工具 DTS**,优势包括:
1. 自动处理大部分语法和数据类型转换。
2. 支持断点续传和并行迁移。
3. 提供更直观的迁移进度和错误报告。

---
### **总结**
- **DBeaver 企业版适合场景**:中小规模数据迁移,需要快速操作且接受部分手动适配。
- **关键步骤**:
1. 驱动配置与连接验证。
2. 使用“数据传输”工具迁移表与数据。
3. 手动调整视图、存储过程等对象的语法。
- **风险提示**:
- 非标语法(如复杂函数)需人工干预。
- 建议在测试环境充分验证后再上生产。