【SQLServer自增列问题】sqlserverwriter
尽管我在presql中配置了set identity_insert @table ON,但是set identity_insert好像是只对当前会话有效,那要如何处理自增列的数据插入问题呢
我也遇到相同问题,有解决方案吗?
我也遇到相同问题,有解决方案吗?
我是这样处理的:建一个和目标表结构一样但是没有自增列的表(是自增列的自增属性去掉),通过datax把数据先转到这个新加的表,然后再用“set identity_insert 目标表 on; insert into 目标表(所有列) select 所有列【不建议用*,用*好像会报错】 from 新加的表 ”
我也遇到相同问题,有解决方案吗?
我是这样处理的:建一个和目标表结构一样但是没有自增列的表(是自增列的自增属性去掉),通过datax把数据先转到这个新加的表,然后再用“set identity_insert 目标表 on; insert into 目标表(所有列) select 所有列【不建议用*,用*好像会报错】 from 新加的表 ”
如果你的表很多,建议建一个过渡库
"preSql": ["set IDENTITY_INSERT @table on;"], "postSql":["set IDENTITY_INSERT @table off;"], 这种方式好像不生效
"preSql": ["set IDENTITY_INSERT @table on;"], "postSql":["set IDENTITY_INSERT @table off;"], 这种方式好像不生效
是的,set IDENTITY_INSERT操作只在同一个sql会话内生效,datax中应该是先单独执行set IDENTITY_INSERT xxx on 再执行转换步骤,不同会话了
"preSql": ["set IDENTITY_INSERT @table on;"], "postSql":["set IDENTITY_INSERT @table off;"], 这种方式好像不生效
是的,set IDENTITY_INSERT操作只在同一个sql会话内生效,datax中应该是先单独执行set IDENTITY_INSERT xxx on 再执行转换步骤,不同会话了
我也遇到了同样的问题,能留个联系方式吗?想和您交流一下您的处理方式。 我的邮箱 [email protected]
"preSql": ["set IDENTITY_INSERT @table on;"], "postSql":["set IDENTITY_INSERT @table off;"], 这种方式好像不生效
是的,set IDENTITY_INSERT操作只在同一个sql会话内生效,datax中应该是先单独执行set IDENTITY_INSERT xxx on 再执行转换步骤,不同会话了
我也遇到了同样的问题,能留个联系方式吗?想和您交流一下您的处理方式。 我的邮箱 [email protected]
我也遇到了同样的问题,能留个联系方式吗?想和您交流一下您的处理方式。 我的邮箱 [email protected]
我也遇到相同问题,有解决方案吗?
我是这样处理的:建一个和目标表结构一样但是没有自增列的表(是自增列的自增属性去掉),通过datax把数据先转到这个新加的表,然后再用“set identity_insert 目标表 on; insert into 目标表(所有列) select 所有列【不建议用*,用*好像会报错】 from 新加的表 ”
还有其他的方案吗?
建议改一下 sqlserverwriter 的逻辑,新增配置标识是否设置 set identity_insert ;如果是,则每次insert前执行set identity_insert table on
我也遇到了,通过修改源代码,然后重新打包 plugin-rdbms-util,就可以了
- 修改代码 com.alibaba.datax.plugin.rdbms.util.DBUtil 大约 700 行左右 dealWithSessionConfig 方法添加 case SQLServer 这一块代码
public static void dealWithSessionConfig(Connection conn,
Configuration config, DataBaseType databaseType, String message) {
List<String> sessionConfig = null;
switch (databaseType) {
case Oracle:
sessionConfig = config.getList(Key.SESSION,
new ArrayList<String>(), String.class);
DBUtil.doDealWithSessionConfig(conn, sessionConfig, message);
break;
case DRDS:
// 用于关闭 drds 的分布式事务开关
sessionConfig = new ArrayList<String>();
sessionConfig.add("set transaction policy 4");
DBUtil.doDealWithSessionConfig(conn, sessionConfig, message);
break;
case MySql:
sessionConfig = config.getList(Key.SESSION,
new ArrayList<String>(), String.class);
DBUtil.doDealWithSessionConfig(conn, sessionConfig, message);
break;
case SQLServer:
sessionConfig = config.getList(Key.SESSION,
new ArrayList<String>(), String.class);
DBUtil.doDealWithSessionConfig(conn, sessionConfig, message);
break;
default:
break;
}
}
- 在根目录重新打包
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
- 用新生成的 plugin-rdbms-util-0.0.1-SNAPSHOT.jar 替换原来的旧包 datax/plugin/writer/sqlserverwriter/libs
- 在 json 文件中新增 session 配置
"writer": {
"name": "sqlserverwriter",
"parameter": {
"session": ["SET IDENTITY_INSERT tableName ON"]
}
}
Thank to @Dr-kyle , this issue has been fixed.
job config:
"writer":{
"name": "sqlserverwriter",
"parameter": {
"session": [
"SET IDENTITY_INSERT tableName ON"
]
}
}