SQL Server → 达梦 DM8 异构数据库迁移 SKILL
> 本 SKILL 用于辅助将 SQL Server(2008 R2 及以上) 的 SQL 对象迁移到 达梦 DM8。
> MySQL → 达梦 场景属于同类异构迁移,规则集中已标注兼容项;如需扩展,请按 references/00-overview.md 的扩展流程追加。
0. 硬规则速查卡(生成前必读 · 14 条红线)
> 本卡是 SKILL 的最高优先级约束。每一条都是模型生成 .dm.sql 时反复违规过的硬伤,必须在生成每段 SQL 前在思考里逐条核对。
> 违反任一条,禁止提交产物。
0.1 临时表 / 局部临时表(5 条)
| 编号 | 规则 | 常见违规模式(已发生) |
|---|---|---|
| R-T01 | 局部临时表结尾 / EXCEPTION 块内禁止写 DROP TABLE IF EXISTS #T。达梦官方明文:"DROP 局部临时表仅兼容语法,并无实际含义"。 |
写 --00 删除临时表 DROP TABLE IF EXISTS #Temp_X; |
| R-T02 | #temp 命名:"首字符 #,第二个字符不能是 #"。#temp 直接保留,禁止改名为 CREATE GLOBAL TEMPORARY TABLE。 |
写 CREATE GLOBAL TEMPORARY TABLE #Temp_X ON COMMIT DELETE ROWS |
| R-T03 | 禁止跨存过共享 #temp。达梦局部临时表仅在所属 DMSQL 程序内可见;SQL Server 跨存过共享必须改 CREATE GLOBAL TEMPORARY TABLE 或真实表 + session_id。 |
直接把 SQL Server 跨存过 #T 转换而不标 !RISK! |
| R-T04 | 禁止在动态 SQL(EXECUTE IMMEDIATE)中建 #temp。官方明文"局部临时表 DDL 不能与 EXECUTE IMMEDIATE 共用"。 |
EXECUTE IMMEDIATE 'CREATE TABLE #T(...)'; |
| R-T05 | DMDPC 集群环境禁止使用 #temp。DMDPC 不支持局部临时表,必须用 CREATE GLOBAL TEMPORARY TABLE。 |
DMDPC 下写 CREATE TABLE #T(...) 编译失败 |
0.2 脚本终止符 /(1 条)
| 编号 | 规则 | 常见违规模式 |
|---|---|---|
| R-S01 | END; / 之后禁止追加任何非空内容(包括 -- 注释、/ 下一行接 Markdown 说明、转换说明块等)。/ 仅在 disql 终端或脚本最后一行(EOF 前)合法。 |
END; / \n --- 转换说明 --- —— 会让 disql 重复解析"转换说明"段 |
0.3 数据类型(4 条)
| 编号 | 规则 | 常见违规模式 |
|---|---|---|
| R-D-T1 | DM 不支持 UNIQUEIDENTIFIER 类型!必须用 CHAR(36) + 业务生成 UUID,或迁移报告 §3.3 中已切换为 UNIQUEIDENTIFIER 的写法都是错的。 |
CREATE TABLE T (id UNIQUEIDENTIFIER, ...) —— 编译失败 |
| R-D-T2 | NUMERIC(p,s) 保留原命名!DM 中 NUMERIC/DECIMAL/DEC/NUMBER 四者完全等价,禁止把 NUMERIC 转 DECIMAL。 |
把 NUMERIC(18,2) 改成 DECIMAL(18,2)(画蛇添足) |
| R-D-T3 | ROWVERSION / SQL Server 行版本戳 在 DM 中无原生等价物。DM 的 TIMESTAMP 是日期时间类型,不是行版本戳。常见方案:BIGINT + 触发器维护。 |
RowVer TIMESTAMP —— 语义错误 |
| R-D-T4 | XML 数据类型 DM 不支持(DM 仅支持 JSON/JSONB)。XML → TEXT 是常见妥协方案。 |
Payload XML —— 编译失败 |
0.4 DML 函数与语法(2 条)
| 编号 | 规则 | 常见违规模式 |
|---|---|---|
| R-D-M1 | DM 中 + 是算术加,字符串拼接必须用 \|\|。SQL Server 的 +(字符串拼接)在 DM 中是数值加。 |
col + N'中文' —— 数值加错误 |
| R-D-M2 | TOP n 保留!DM 原生支持 TOP(官方 disql-script.html §5.5 示例即用 select top 3 * from v$dm_ini;)。禁止把 TOP n 换 LIMIT n。 |
SELECT TOP 10 → SELECT LIMIT 10(语法错误) |
0.5 存过 / 触发器(2 条)
| 编号 | 规则 | 常见违规模式 |
|---|---|---|
| R-P-T1 | 存过 / 触发器支持 WITH ENCRYPTION!禁止当作"DM 不支持"。 |
去掉源 SQL Server 的 WITH ENCRYPTION |
| R-P-T2 | 触发器引用变量必须显式 REFERENCING OLD AS o NEW AS n 子句,然后用 :NEW.col / :OLD.col(使用位置有冒号,声明位置无冒号)。仅写 :NEW.col 不写 REFERENCING 子句编译失败。 |
CREATE TRIGGER ... FOR EACH ROW BEGIN ... :NEW.col ... END; —— 缺少 REFERENCING |
0.6 必做自检(生成后立刻做)
完成产物后,必须对每条 R-T0X / R-S01 / R-D-TX / R-D-MX / R-P-TX 逐条回答:
- 该规则是否适用本文件?(Y/N)
- 产物中是否已遵守?(Y/N)
- 如 N,是否已标
!RISK!并给出人工建议?
未完成自检 = 未完成产物。
1. 触发条件
满足以下任一即触发本 SKILL:
- 用户在 IDE/CC/CodeX/Hermas/DSH 中选中
.sql、.tsql、存储过程脚本,并说"转换到达梦/达梦 DM/DM8"。 - 用户粘贴 PRD/任务清单,要求把项目里
src/sql/、sql/、StoredProcedures/等目录下的 SQL 文件批量转换到达梦。 - 关键词:
迁移到达梦、DM8、国产化、异构迁移、反写存储过程、SQL Server 语法转换。
不触发:本 SKILL 不处理数据迁移(DTS 数据搬运)、不处理 MySQL/Oracle 自身的内部方言问题(除非作为源库)。
2. 强制原则(违反任何一条,输出视为无效)
> P1 — 上下文优先(Context First):禁止"看到一条改一条"。在动手转换前,必须先通读整个文件/整个存过/同一批次的所有语句,建立"上下文快照"。达梦 DM8 的临时表、动态 SQL、序列、MERGE INTO、TRY…CATCH、事务隔离级别、游标行为、@@IDENTITY / SCOPE_IDENTITY() 等均有与 SQL Server 不一致的语义,必须结合上下文统一处理。
> P2 — 可验证优先(Verifiable First):每个被转换的 SQL/存过,必须附带:
> 1. 转换说明(diff + 文字说明);
> 2. 静态校验标记(哪些规则被命中);
> 3. 离线验证脚本(至少包含 DDL 回放、语义对比、行数对比);
> 4. 风险点清单(标 !RISK!,给人工核验)。
> P3 — 类型与字符集对齐(Type & Charset Alignment):SQL Server 默认字符集是 UCS-2/UTF-16,达梦 DM8 默认 GB18030。字符串列、临时表、变量、NVARCHAR/VARCHAR(MAX)/TEXT/NTEXT/IMAGE 必须在文件顶部声明或在转换说明中显式提示用户做字符集确认。
> P4 — 输出可回溯(Traceable Output):转换结果 必须使用统一注释前缀标识每条规则的来源(如 -- DM-MIG: DDL-001 VARCHAR(MAX) → TEXT),便于后续自动化扫描。
> P5 — 宁缺勿造(Don't Fabricate):遇到无法确定对应达梦语法的项(极少见方言、私有扩展、CLR 存过、Service Broker、SQLXML 等),禁止臆测,必须标 !UNMAPPED! 并给出来源 SQL 与人工处理建议。
> P6 — 依赖预扫描 + 人机交互阻断(Dependency Pre-scan & Halt-and-Ask):在转换任何 存储过程 / 函数 / 触发器 / 视图 之前,必须先穷举其所引用的所有对象(基表、视图、子过程、子函数、临时表、序列、用户自定义类型、链接服务器、外部 DLL/CLR),并逐项核对依赖对象是否已存在、是否已转换、是否可访问。一旦发现 缺失 / 异常 / 名称不匹配 / 跨库访问 / 私有扩展,必须立即停止转换,进入"人机交互"流程,禁止跳过阻断、禁止基于假设继续。
3. 使用流程(两个场景共用前置步骤)
2.1 第一步:确认源库与目标库(不可省略)
必须向用户确认(或从 PRD 中读取)以下 4 项,缺一不可:
| 项目 | 必选 | 默认值 | 说明 |
|---|---|---|---|
| 源数据库类型 | 是 | — | 当前 SKILL 覆盖 SQL Server(必须)、MySQL(兼容) |
| 源数据库版本 | 是 | SQL Server 2008 R2 | 涉及 STRING_SPLIT、FORMAT、IIF、窗口函数等版本差异 |
| 目标数据库 | 是 | 达梦 DM8 | 本 SKILL 暂仅支持 DM8 |
| 目标字符集 | 是 | GB18030 | UTF-8 / GBK / GB18030 决定 NVARCHAR → VARCHAR / NVARCHAR 的取舍 |
> 未确认完毕前,不要开始任何转换。即使是一行 SELECT 也必须先确认。
2.2 第二步:上下文快照(Context Snapshot)
在动手转换前,必须在内部(或在回复中以表格形式)对当前文件/批次产出"上下文快照":
- 临时表:
#temp/@table_var出现位置、列定义、是否跨批次、是否在存过内; - 序列与自增:
IDENTITY列、SEQUENCE对象、@@IDENTITY/SCOPE_IDENTITY()使用; - 事务与异常:
BEGIN TRAN/TRY…CATCH/XACT_ABORT嵌套; - 动态 SQL:
EXEC sp_executesql/EXEC()/ 嵌套调用; - 游标:
DECLARE CURSOR+FETCH循环内的INSERT/UPDATE/DELETE; - 系统函数:
@@ROWCOUNT、@@ERROR、@@TRANCOUNT、@@FETCH_STATUS、ISNULL/COALESCE、GETDATE()/SYSDATETIME()、NEWID()/NEWSEQUENTIALID(); - 对象依赖:跨文件/跨存过的依赖(视图→表、存过→表、触发器→表);
- 字符集:
NVARCHARvsVARCHAR、N'…'前缀; - 标识符:是否使用了 SQL Server 的
[brackets]、"double quotes"、保留字冲突。
快照产出后,才允许进入规则匹配阶段。
2.3 第三步:规则匹配与转换
按 references/10-ddl-mapping.md → 20-dml-mapping.md → 30-proc-mapping.md → 40-context-pitfalls.md 的顺序逐项匹配。
每命中一条规则,必须在转换结果上方/旁边用注释标记:
-- DM-MIG: <RULE-CODE> <说明>
-- 原: <原 SQL 片段>
-- 新: <新 SQL 片段>
-- 风险: <低/中/高> —— <理由>
2.4 第四步(仅存过/函数/触发器/视图):依赖对象预扫描 —— 命中 P6 时为强阻断
> 本步骤是 P6 的强制落地,仅适用于 存储过程 / 函数 / 触发器 / 视图;纯 DDL/DML 文件可跳过。
2.4.1 扫描范围(不可遗漏任何一类)
从待转换文件的全量语句(含动态 SQL、注释内的提示、字符串字面量中嵌入的表名)中提取:
| 类别 | 必扫 | 示例 |
|---|---|---|
| 基表 | ✅ | FROM Orders、UPDATE T、INSERT INTO dbo.Log |
| 视图 | ✅ | FROM V_OrderSummary、MERGE INTO v_target |
| 子存储过程 | ✅ | EXEC P_X、CALL P_X、动态 SQL 内的 EXEC |
| 用户自定义函数 | ✅ | SELECT dbo.F_Calc(...) |
| 临时表 | ✅ | #temp、@table_var、嵌套存过内 #temp |
| 序列 | ✅ | NEXT VALUE FOR seq、seq.NEXTVAL |
| 用户自定义类型 | ✅ | UDT_X、TYPE_X(UDT)、表类型 |
| 链接服务器 / 跨库访问 | ✅ | linked_server.db.dbo.T、4 部分名称 |
| CLR / 外部资源 | ✅ | EXEC sp_OACreate、CREATE ASSEMBLY、引用 DLL |
| 触发器递归触发 | ✅ | TR_T 触发表 → 该表又有 TR_T2 |
| 同义词 | ✅ | SELECT * FROM syn_T(其本体要追溯) |
| 用户自定义聚合 / 排序规则 | ✅ | WITH SCHEMABINDING 视图里自定义对象 |
2.4.2 核对动作
针对上一步提取出的每个对象,必须回答以下 5 个问题:
- 存在性:该对象在源库是否存在?(来源:sys.objects / sys.tables / 业务 PRD)
- 可访问性:当前 SKILL 是否已被授权访问?(Vibe 场景:用户是否已提供;SDD 场景:PRD 中是否声明)
- 是否已转换:在 SDD 模式下,该对象是否已经在前置批次中转换完成?(参见
references/40-context-pitfalls.md第 7.2 节"迁移顺序") - 是否在转换范围内:是否属于本 SKILL 覆盖范围?若是 CLR / 外部 DLL →
!UNMAPPED!。 - 跨库 / 跨域:是否涉及其他数据库、其他 schema、其他主机?若是,需要单独决策。
2.4.3 阻断条件(任一触发即停)
| 现象 | 处理 |
|---|---|
| 对象在源库不存在(拼写错 / 已废弃 / 临时表未在本文件定义) | 阻断,必须询问用户 |
| 对象存在但当前批次未转换(违反迁移顺序) | 阻断,必须确认是否先转换该对象 |
| 对象存在但用户未提供 / 缺失源文件 | 阻断,必须询问是否补文件 |
| 对象涉及链接服务器 / 跨库访问 / 其他 schema | 阻断,必须确认访问路径与权限 |
| 对象是 CLR / 外部 DLL / Service Broker / SQLXML | 阻断 + 标 !UNMAPPED! + 给出替代建议 |
| 对象是用户自定义类型 UDT | 阻断,确认 UDT 是否先转换或改造 |
| 循环依赖:A 调 B、B 调 A | 阻断,必须由用户/架构师决策拆解 |
2.4.4 人机交互输出格式(Vibe + SDD 共用)
当触发阻断时,必须用以下结构回复用户,且不要附带任何转换结果:
## ⚠️ 依赖对象缺失 / 异常 —— 已停止转换
**当前文件**:`src/proc/P_Transfer.sql`
**待转换对象**:`P_Transfer`
**发现的问题**(共 N 项):
| # | 对象名 | 类型 | 状态 | 风险 | 建议 |
| --- | --- | --- | --- | --- | --- |
| 1 | `Orders` | 基表 | ⚠️ 未提供源文件 | 高 | 补充 `ddl/orders.sql` |
| 2 | `V_OrderSummary` | 视图 | ⚠️ 未转换 | 高 | 先转换 `view/V_OrderSummary.sql` |
| 3 | `seq_order_no` | 序列 | ⚠️ 未转换 | 中 | 先转换 `ddl/seq_order_no.sql` |
| 4 | `LinkedSvr2.DW.dbo.DimDate` | 跨库表 | ⚠️ 链接服务器未配置 | 高 | 由 DBA 配置 DBLink 或改造 SQL |
| 5 | `dbo.CLR_Filter` | CLR 函数 | ❌ !UNMAPPEDED | 高 | 改纯 SQL 重写或外迁 |
**请用户决策**(任选):
1. 补充缺失文件 → 转换完成后我**重新发起依赖扫描**,再继续本文件;
2. 仅转换本文件中**不依赖缺失对象**的部分(推荐程度最低,语义可能不一致);
3. 跳过本文件,进入下一任务;
4. 暂停整个流程,等待人工干预。
收到用户答复后:根据答复类型走对应分支;如答复为"补充文件",必须重新执行 2.5.1 ~ 2.5.2,确认全部依赖都已就位才能继续;不得基于历史上下文推断"应该 OK 了"。
2.4.5 Vibe 场景的快捷确认
如果用户明确说"所有依赖都已转换好"/"你不用检查依赖了",仍必须把扫描结果展示给用户并附带:
按你的指示跳过依赖核查。但我已扫出以下依赖项,请确认:
- 依赖基表 5 张、视图 2 个、子过程 3 个、序列 1 个
- ⚠️ 检测到未提供源的对象:`CLR_Filter`、`LinkedSvr2.DimDate`
- 是否真的可以继续?是 / 否
> 即使用户授权"跳过检查",也至少要标注发现项并获得显式确认,避免后续翻车。
2.4.6 SDD 场景的阻塞登记
SDD 模式下,每次触发阻断必须:
1. 在 migration-runbook.md 的"阻塞项"表追加一行(含对象名、文件路径、责任人、解决方式);
2. 整个流程暂停,等待用户/责任人决策;
3. 决策落地后,从被阻断的文件重新发起转换(不是恢复旧的中间态);
4. 每累计 5 个阻塞项,必须停下来向用户回报整体进展。
2.5 第五步:产出验证脚本
对每个被转换的文件,必须同时产出以下三个文件/片段(即使是 Vibe 会话场景,也要在回复中以代码块给出):
<原文件名>.dm.sql—— 转换后的达梦 SQL;<原文件名>.verify.sql—— 离线验证脚本(DDL 回放 + 数据对比 + 行数对比);<原文件名>.migration-report.md—— 转换报告(含上下文快照、命中规则、风险点)。
4. 两种使用场景的具体差异
3.1 Vibe 会话型(单文件 / 选中片段)
触发:用户在 IDE 中选中 1 个 .sql 文件或一段 SQL,要求"转达梦"。
行为规范:
- 读取用户选中的内容(整文件优先;片段则要追问"是不是只看这一段"——因为临时表可能跨片段)。
- 走完第 2 节"确认源/目标 → 上下文快照 → 规则匹配 → 验证脚本"完整 4 步。
- 输出顺序固定:
- (a) 上下文快照表格(哪怕只有 5 行);
- (b) 转换后的 SQL(带-- DM-MIG:注释);
- (c) 转换说明(diff 表格 + 文字);
- (d) 验证脚本(.verify.sql内容);
- (e) 风险清单(!RISK!/!UNMAPPED!)。 - 不要直接覆盖原文件 —— 写到
<原文件名>.dm.sql同目录,提示用户 diff。
3.2 SDD 任务型(PRD 驱动批量转换)
触发:用户给出 PRD/任务清单(典型文档:PRD-sqlserver-to-dameng.md 或项目下 tasks/migration-tasks.md),要求按清单逐文件迁移。
行为规范:
- 先读取 PRD,提取任务清单:
[{task_id, file, objects[], priority}]。 - 强制预扫描全项目:
- 列出所有.sql/.tsql/.pck/.prc/.fn/.trg/.vw;
- 找出跨文件依赖(视图引用表、存过调用存过、触发器绑表);
- 产出转换顺序(被依赖的先转,如:表 → 视图 → 存过 → 触发器 → 应用 SQL)。 - 按依赖顺序逐文件转换,每个文件走完整 4 步。
- 维护一份
migration-runbook.md(迁移运行手册),逐文件登记:
- 任务 ID / 文件 / 转换时间 / 命中规则 / 风险等级 / 是否需人工核验 / 验证脚本路径。 - 每完成 5 个文件或遇到
!UNMAPPED!时,必须停下来向用户回报,等待确认或继续。
5. 加载顺序(按需)
| 阶段 | 必读 references |
|---|---|
| 第 1 步(确认源/目标) | — |
| 第 2 步(上下文快照) | 40-context-pitfalls.md |
| 第 3 步(规则匹配) | 10-ddl-mapping.md → 20-dml-mapping.md → 30-proc-mapping.md → 40-context-pitfalls.md |
| 第 4 步(验证) | 50-verification.md |
| 输出前自检 | 90-checklist.md |
6. 禁止行为(红线)
- 禁止直接把
[brackets]替换为"double quotes"—— 达梦中括号[id]也是合法标识符,但语义与 SQL Server 不同(SQL Server 中括号用于保留字转义,达梦中括号是数组下标)。 - 禁止把
TOP n替换为LIMIT n后就结束 —— 还需要检查TOP n PERCENT、TOP n WITH TIES、TOP在DELETE/UPDATE中的位置(达梦不支持UPDATE TOP/DELETE TOP)。 - 禁止把
ISNULL(a, b)直接替换为NVL(a, b)或COALESCE(a, b)—— 三者在多参数、空值传播、性能上不等价。 - 禁止把
TRY…CATCH直接替换为达梦的EXCEPTION块 —— 达梦 DM8 的 PL/SQL 风格异常处理与 SQL Server 的TRY…CATCH语义差异极大(见30-proc-mapping.md)。 - 禁止把
IDENTITY(1,1)直接保留 —— 达梦不支持IDENTITY属性,必须改为INT IDENTITY(1,1)等价物(序列 + 触发器,或AUTO_INCREMENT视情况)。 - 禁止假定
VARCHAR(MAX)与TEXT完全等价 —— 达梦TEXT不可用于GROUP BY/ 索引 / 某些函数参数。 - 禁止忽略 GO 批分隔符 —— 达梦执行
;结束符,GO必须去除或转为脚本注释。 - 禁止对动态 SQL
EXEC sp_executesql简单替换 —— 见30-proc-mapping.md章节 6。 - 禁止跳过验证脚本产出 —— "转换完没生成
.verify.sql" = 没完成。 - 禁止在依赖对象未确认时继续(违反 P6)—— 任何存储过程 / 函数 / 触发器 / 视图在转换前必须完成依赖预扫描;发现缺失 / 异常 / 跨库 / CLR / 循环依赖时,必须立即停止并进入人机交互流程,不得基于"用户应该会补"或"应该没问题"继续。
- 禁止把 SQL Server
TOP n一律换LIMIT n—— 达梦 DM8 原生支持TOP(参见disql-script.html5.5 节官方示例),业务允许时直接保留 TOP。 - 禁止把
NUMERIC(p,s)一律转DECIMAL(p,s)—— 达梦 DM8 同时支持 NUMERIC / DECIMAL / DEC / NUMBER 四者等价,保留原命名即可。 - 禁止把
DATETIME / DATETIME2转TIMESTAMP时把语义弄错 —— 达梦TIMESTAMP与DATETIME是同义词(不是 SQL Server 的行版本戳);SQL ServerROWVERSION/TIMESTAMP(行版本戳)在达梦无原生等价物。 - 禁止把局部临时表结尾 / EXCEPTION 内的
DROP TABLE #T当作"清理必须" —— 官方明确"DROP 局部临时表仅兼容语法、无实际含义",是冗余。 - 禁止把存过 / 触发器
WITH ENCRYPTION当作"DM 不支持" —— DM 支持(v1 反转)。 - 禁止把触发器引用变量写成
:NEW.col/:OLD.col但忘了REFERENCING子句 —— DM 触发器必须显式声明引用变量名。 - 禁止跨存过共享
#T—— 达梦局部临时表仅作用域于所在 DMSQL 程序,SQL Server 跨存过共享必须改用CREATE GLOBAL TEMPORARY TABLE或真实表 + session_id。 - 禁止在动态 SQL 中建
#T—— 局部临时表 DDL 不能与 EXECUTE IMMEDIATE 共用(官方dm8_sql-various-control.html§4.1 明文)。 - 禁止用
##G全局临时表 —— 达梦无此概念,改CREATE GLOBAL TEMPORARY TABLE。 - 禁止DMDPC 集群环境使用局部临时表 —— DMDPC 不支持局部临时表,必须用 GLOBAL TEMPORARY TABLE。
- 禁止对 XML / UNIQUEIDENTIFIER / ROWVERSION / GEOGRAPHY / HIERARCHYID / SQL_VARIANT 假定达梦有等价类型 —— 这些全部 !UNMAPPED!,见
10-ddl-mapping.md§1.5 / §1.6。 - 禁止把 PL/SQL 块结尾的
/当作"必须去除" ——/是 disql 终端合法的执行触发符;但/紧跟非 SQL 注释块会引发歧义,禁止在END; /之后再追加任何非空内容。
7. 输出格式约束
无论场景,最终输出必须包含以下区块(顺序可调,缺一不可):
- 上下文快照表
- 转换后 SQL(带
-- DM-MIG:注释) - 转换说明(变更项 + 原因)
- 风险清单(
!RISK!/!UNMAPPED!列表) - 离线验证脚本(
.verify.sql完整内容) - 下次迁移前置条件(如下游文件依赖了本次产出的对象)
8. 元信息
- SKILL 版本:2.0.1(新增 §0 硬规则速查卡:14 条红线集中放在 SKILL 头部,模型生成每段 SQL 前必读;基于 v2.0.0 阶段后产物复核中发现模型反复违规的事实)
- 目标数据库版本:达梦 DM8(默认兼容 2024 年以前的 DM8 子版本;2025 后子版本多数规则同样适用)
- 源数据库版本:SQL Server 2008 R2 / 2012 / 2014 / 2016 / 2017 / 2019 / 2022
- MySQL 兼容范围:5.7 / 8.0(标注差异点,不做为主路径)
- 已知不支持项:CLR 存过、Service Broker、SQLXML、FileTable、External Scripts、PolyBase
9. 快速入口
- 核心原则、扩展流程:
references/00-overview.md - DDL 映射:
references/10-ddl-mapping.md - DML 映射:
references/20-dml-mapping.md - 存过/函数/触发器:
references/30-proc-mapping.md - 上下文依赖陷阱:
references/40-context-pitfalls.md - 验证脚本模板:
references/50-verification.md - 输出前自检清单:
references/90-checklist.md