Microsoft SQL Server To GaussDB配置项使用说明
问题描述 |
配置建议 |
建议值 |
---|---|---|
Microsoft SQL Server 表字段支持IDENTITY属性,但GaussDB不支持该属性,默认无法迁移。 |
建议配置”IDENTITY列“解决该类问题。 |
将IDENTITY属性列转换为SERIAL类型。 影响:序列号数据类型是四个字节的自增整数。取值范围为1至2147483647。超过这个上限,GaussDB将报错,DML语句执行失败。 |
Microsoft SQL Server 表字段支持bit类型,但是GaussDB,不支持该属性,默认无法迁移。 |
建议配置“bit类型”解决该类问题。 |
将bit类型转化为boolean类型。 影响:boolean类型的取值相比bit类型多了一个“null”。 |
Microsoft SQL Server支持datetimeoffset数据类型,但是GaussDB不支持, 默认转成timestamptz(二者最大秒数精度存在差异),时间函数year等转换方案处理结果在特殊情况下存在差异。 |
建议配置"datetimeoffset类型转换"解决该类问题 |
将datetimeoffset类型转换为varchar2类型。 影响:datetimeoffset类型转换为varchar2类型。 |
高斯O模式空字符串''等同于null,ISNULL等函数转换方案存在语义问题。 |
建议配置"忽略空字符串''为null的风险"解决该类问题。 |
不忽略空字符串''为null的风险。 影响:存在空字符串''风险的函数不进行转换。 |
GaussDB 分布式不支持外键约束,相关CREATE TABLE以及ALTER TABLE语句涉及外键约束会导致执行异常,需要根据实际业务情况选择是否需要外键特性。 |
建议配置"FOREIGN KEY约束"解决该类问题。 |
影响:注释FOREIGN KEY约束,注释后,原表的外键约束失效,不能确保数据保持一致,有可能创建不一致的数据。 |
GaussDB 数据库不支持Microsoft SQL Server表变量(包括多语句表值函数返回表定义),目前GaussDB 较为接近的转换方案为临时表,二者在部分使用场景下有区别,用户根据需要选择是否开启对表变量类型的转换。 |
建议配置"是否转换表变量(包括多语句表值函数返回表定义)"解决该类问题。 |
将表变量转换临时表。 影响:Microsoft SQL Server中显式表变量不遵循事务的回滚语义,GaussDB中临时表遵循事务回滚语义,需要关注业务语义是否发生变化。 |
GaussDB 数据库不支持存储过程内的SELECT语句,目前GaussDB 较为接近的转换方案为使用动态游标将结果从存储过程内传递出来。 |
建议配置"是否将存储过程中的SELECT语句利用游标处理"解决该类问题。 |
利用游标处理存储过程中的SELECT语句。 影响:如果需要获取存储过程中的结果集,则需要对相关调用形式进行修改。 |
创建索引过程不阻塞DML操作 |
建议配置:“CREATE INDEX的CONCURRENTLY子句”解决该类问题 |
建议值:如果业务非常需要这个功能,建议选择添加CONCURRENTLY关键字选项。 影响:创建这类索引时候,容易造成死锁,同时对Astore的表索引的创建比正常更长。 |
GaussDB 保留对象名称大小写需要使用双引号引用对象名称。 |
建议配置 “对象名称大小写转换” 解决该类问题。 |
建议值:对象名称全部转换为小写。 |
Microsoft SQL Server中LIKE运算符两侧表达式内数据类型要求为字符串加“+”可以视为风险字符串拼接。 |
建议配置"是否将LIKE运算符两侧表达式内的加号视为字符串拼接"解决该类问题。 |
建议值:将LIKE运算符两侧表达式内的加号视为字符串拼接。 影响:部分场景可能会错误的将原来表示算数运算的“+”转换为字符串拼接符。 |
Gauss中索引以及约束要求名称全局唯一,且大小不超过63字节。 |
建议配置"索引/约束名称防止冲突映射策略"解决该类问题。 |
建议值:将表名与索引/约束名称拼接防止命名冲突,当拼接后的名称超过63字节时使用SHA-1进行散列。 影响:解决命名冲突问题,但是当名称较长时丧失名称的可读性,且在后续的DROP、RENAME等维护过程中,也需要使用UGO转换SQL才能正确执行。 |
SQL Server中触发器内使用的函数UPDATE(column)在GaussDB中无完美对应物。 |
建议配置"UPDATE(column)语法"解决该类问题。 |
建议值:将 UPDATE(column) 转换为 case TG_OP when 'UPDATE' then NEW.column <> OLD.column when 'INSERT' then true else false end。 影响:此配置在column更新后值保持不变的场景下会与Microsoft SQL Server产生差异。当column更新前后值未发生变化时,Microsoft SQL Server中UPDATE(column)条件的结果为True,但GaussDB中(NEW.column <> OLD.column)条件的结果为False。 |
GaussDB分布式中分布键应该为唯一性约束的一部分。 |
建议配置"分布式环境(多数据节点)的唯一约束和索引"解决该类问题。
说明:
仅分布式有此特性。 |
如果唯一约束和唯一索引中不存在分布键,需添加分布键。 影响:目标数据库是分布式部署,分布键应该是约束的一部分。该配置将约束键附加到分布键中。 |