DataX icon indicating copy to clipboard operation
DataX copied to clipboard

【SQLServer自增列问题】sqlserverwriter

Open dsdg2016 opened this issue 7 years ago • 9 comments

尽管我在presql中配置了set identity_insert @table ON,但是set identity_insert好像是只对当前会话有效,那要如何处理自增列的数据插入问题呢

dsdg2016 avatar Oct 16 '18 02:10 dsdg2016

我也遇到相同问题,有解决方案吗?

ibmsun1 avatar Oct 25 '18 02:10 ibmsun1

我也遇到相同问题,有解决方案吗?

我是这样处理的:建一个和目标表结构一样但是没有自增列的表(是自增列的自增属性去掉),通过datax把数据先转到这个新加的表,然后再用“set identity_insert 目标表 on; insert into 目标表(所有列) select 所有列【不建议用*,用*好像会报错】 from 新加的表 ”

dsdg2016 avatar Oct 25 '18 02:10 dsdg2016

我也遇到相同问题,有解决方案吗?

我是这样处理的:建一个和目标表结构一样但是没有自增列的表(是自增列的自增属性去掉),通过datax把数据先转到这个新加的表,然后再用“set identity_insert 目标表 on; insert into 目标表(所有列) select 所有列【不建议用*,用*好像会报错】 from 新加的表 ”

如果你的表很多,建议建一个过渡库

dsdg2016 avatar Oct 25 '18 02:10 dsdg2016

"preSql": ["set IDENTITY_INSERT @table on;"], "postSql":["set IDENTITY_INSERT @table off;"], 这种方式好像不生效

ibmsun1 avatar Oct 25 '18 03:10 ibmsun1

"preSql": ["set IDENTITY_INSERT @table on;"], "postSql":["set IDENTITY_INSERT @table off;"], 这种方式好像不生效

是的,set IDENTITY_INSERT操作只在同一个sql会话内生效,datax中应该是先单独执行set IDENTITY_INSERT xxx on 再执行转换步骤,不同会话了

dsdg2016 avatar Oct 25 '18 03:10 dsdg2016

"preSql": ["set IDENTITY_INSERT @table on;"], "postSql":["set IDENTITY_INSERT @table off;"], 这种方式好像不生效

是的,set IDENTITY_INSERT操作只在同一个sql会话内生效,datax中应该是先单独执行set IDENTITY_INSERT xxx on 再执行转换步骤,不同会话了

我也遇到了同样的问题,能留个联系方式吗?想和您交流一下您的处理方式。 我的邮箱 [email protected]

jimmy-bj avatar Sep 16 '20 01:09 jimmy-bj

"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]

huangyuanyazi avatar Nov 25 '21 04:11 huangyuanyazi

我也遇到相同问题,有解决方案吗?

我是这样处理的:建一个和目标表结构一样但是没有自增列的表(是自增列的自增属性去掉),通过datax把数据先转到这个新加的表,然后再用“set identity_insert 目标表 on; insert into 目标表(所有列) select 所有列【不建议用*,用*好像会报错】 from 新加的表 ”

还有其他的方案吗?

jason1004 avatar Oct 25 '22 14:10 jason1004

建议改一下 sqlserverwriter 的逻辑,新增配置标识是否设置 set identity_insert ;如果是,则每次insert前执行set identity_insert table on

jason1004 avatar Oct 25 '22 14:10 jason1004

我也遇到了,通过修改源代码,然后重新打包 plugin-rdbms-util,就可以了

  1. 修改代码 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;
        }
    }
  1. 在根目录重新打包
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
  1. 用新生成的 plugin-rdbms-util-0.0.1-SNAPSHOT.jar 替换原来的旧包 datax/plugin/writer/sqlserverwriter/libs
  2. 在 json 文件中新增 session 配置
"writer": {
                    "name": "sqlserverwriter",
                    "parameter": {
                        "session": ["SET IDENTITY_INSERT tableName ON"]
                    }
                }

Dr-kyle avatar Feb 03 '23 10:02 Dr-kyle

Thank to @Dr-kyle , this issue has been fixed.

job config:

"writer":{
    "name": "sqlserverwriter",
    "parameter": {
        "session": [
            "SET IDENTITY_INSERT tableName ON"
        ]
    }
}

dingxiaobo avatar Feb 10 '23 06:02 dingxiaobo