#DM SQL转换

本文档基于DM8已有语法,根据SQL转换对以下语法进行了规则化的转换。

# 概述

在YMP的任务评估阶段,会对源数据库中的对象(表、视图、约束、索引等)进行兼容性评估,以确保源端数据库对象可以成功迁移到目标数据库。在评估阶段,会尝试获取源端数据库对象的DDL并在目标数据库执行。如果执行成功,则说明此对象为原生兼容,无需进行特殊处理。否则,会使用SQL转换工具根据源端到目标端数据库的语法转换规则对此DDL进行语法转换,以适配目标数据库的语法特性。如果转换成功,会尝试在目标数据库中执行转换后的SQL,执行成功则说明此对象为自动兼容,可以进行迁移。

# CREATE TABLE

序号 DM语法/关键字 YashanDB22.2转换规则
1 <AUTO_INCREMENT子句> IDENTITY [(<种子>,<增量>)] 转为独立序列对象
2 STORAGE子句 删除
3 表内约束和非空信息 转为独立约束对象
4 PARTITION子句:
PARTITION BY <PARTITION项>
PARTITION项:
RANGE (<列名>{,<列名>})[INTERVAL (<间隔表达式>)] (<RANGE分区项> {,<RANGE分区项>})
|HASH (<列名>{,<列名>}) PARTITIONS <分区数>
|HASH(<列名>{,<列名>})(<HASH分区项> {,<HASH分区项>})
|LIST(<列名>(<LIST分区项> {,<LIST分区项>}))
只保留YashanDB支持的分区定义信息
5 RANGE分区项:
PARTITION <分区名> VALUES LESS THAN
(< <常量表达式>| MAXVALUE >{,< <常量表达式>|<MAXVALUE >})
[<表空间子句>]
[<STORAGE子句>]
只保留YashanDB支持的常量表达式
表空间子句 与 STORAGE子句会被删除
6 HASH分区项:
PARTITION <分区名>
[<表空间子句>]
[<STORAGE子句>
表空间子句 与 STORAGE子句会被删除
7 LIST分区项:
PARTITION <分区名> VALUES
(DEFAULT|<表达式>,{<表达式>}>)
[<表空间子句>]
[<STORAGE子句>]
只保留YashanDB支持的表达式
表空间子句 与 STORAGE子句会被删除
8 STORAGE项:
INITIAL <初始簇数目>
删除
9 表空间子句:
TABLESPACE <表空间名>
删除

# CREATE INDEX

序号 DM语法/关键字 YashanDB22.2转换规则
10 [CLUSTER|NOT PARTIAL][UNIQUE | BITMAP | SPATIAL] 仅支持UNIQUE类型和普通类型,[CLUSTER|NOT PARTIAL]剔除
11 STORAGE子句 删除

# ALTER TABLE ADD CONSTRAINT / SET NOT NULL

序号 DM语法/关键字 YashanDB22.2转换规则
12 ALTER COLUMN_NAME SET NOT NULL MODIFY COLUMN_NAME NOT NULL
13 CLUSTER等关键字 删除

# CREATE VIEW

序号 DM语法/关键字 YashanDB22.2转换规则
14 CREATE
[OR REPLACE]
VIEW
[<模式名>.]<视图名>
[(<列名> {,<列名>})] AS <查询说明>
保留OR REPLACE
15 查询说明:
<表查询>
|><表连接>
只保留YashanDB支持的查询语法

# 全部示例

# 示例1

 -- DM
 CREATE TABLE "TEST_1"
("ID" INT AUTO_INCREMENT NOT NULL,
NOT CLUSTER PRIMARY KEY("ID")) 
STORAGE(ON "MAIN", CLUSTERBTR) AUTO_INCREMENT = 1;

CREATE TABLE "T33"
("ID" INT IDENTITY(100, 1) NOT NULL,
"ID2" INT NOT NULL) STORAGE(ON "MAIN", CLUSTERBTR) ;
 -- YashanDB22.2预期结果
CREATE SEQUENCE TEST_1_ID_SEQ START WITH 1;
CREATE TABLE "TEST_1" (
	"ID" INT DEFAULT "TEST_1_ID_SEQ".NEXTVAL
);

CREATE SEQUENCE T33_ID_SEQ INCREMENT BY 100 START WITH 1
CREATE TABLE "T33" (
	"ID" INT DEFAULT "T33_ID_SEQ".NEXTVAL,
	"ID2" INT
);

# 示例2

 -- DM
CREATE OR REPLACE CLUSTER  INDEX "CLINDEX" ON "XIASS"."T1"("ID" ASC) STORAGE(ON "MAIN", CLUSTERBTR) ;
 -- YashanDB22.2预期结果
CREATE INDEX "CLINDEX" ON "XIASS"."T1" ("ID" ASC);
 

# 示例3

 -- DM
ALTER TABLE "USER_1"."T33" ALTER COLUMN  "ID" SET NOT NULL;
 -- YashanDB22.2预期结果
ALTER TABLE "USER_1"."T33"  MODIFY "ID" NOT NULL;
 

# 示例4

 -- DM
ALTER TABLE "USER_1"."PK"  ADD CONSTRAINT "CONS134219820" NOT CLUSTER PRIMARY KEY("ID");
 -- YashanDB22.2预期结果
ALTER TABLE "USER_1"."PK" ADD CONSTRAINT "CONS134219820" PRIMARY KEY ("ID");

# 示例5

 -- DM
CREATE  OR REPLACE  VIEW TEST1926.VIEW4 AS  SELECT TEST1926.VIEW_TABLE1.COL0 FROM TEST1926.VIEW_TABLE1;
 -- YashanDB22.2预期结果
CREATE  OR REPLACE  VIEW TEST1926.VIEW4 AS  SELECT TEST1926.VIEW_TABLE1.COL0 FROM TEST1926.VIEW_TABLE1;