Browse Source

修复插入sqlserver标识自增列

穿云 5 months ago
parent
commit
e104d05bbf

+ 15 - 6
dbsyncer-connector/dbsyncer-connector-sqlserver/src/main/java/org/dbsyncer/connector/sqlserver/SqlServerConnector.java

@@ -39,6 +39,9 @@ public final class SqlServerConnector extends AbstractDatabaseConnector {
 
     private final String QUERY_VIEW = "select name from sysobjects where xtype in('v')";
     private final String QUERY_TABLE = "select name from sys.tables where schema_id = schema_id('%s') and is_ms_shipped = 0";
+    private final String QUERY_TABLE_IDENTITY = "select is_identity from sys.columns where object_id = object_id('%s') and is_identity > 0";
+    private final String SET_TABLE_IDENTITY_ON = "set identity_insert %s.[%s] on;";
+    private final String SET_TABLE_IDENTITY_OFF = ";set identity_insert %s.[%s] off;";
 
     private final String TYPE = "SqlServer";
     private final SqlServerConfigValidator configValidator = new SqlServerConfigValidator();
@@ -130,12 +133,18 @@ public final class SqlServerConnector extends AbstractDatabaseConnector {
     @Override
     public Map<String, String> getTargetCommand(CommandConfig commandConfig) {
         Map<String, String> targetCommand = super.getTargetCommand(commandConfig);
-        String insert = new StringBuilder("SET IDENTITY_INSERT ")
-                .append(commandConfig.getTable().getName())
-                .append(" ON;")
-                .append(targetCommand.get(ConnectorConstant.OPERTION_INSERT))
-                .toString();
-        targetCommand.put(ConnectorConstant.OPERTION_INSERT, insert);
+        String tableName = commandConfig.getTable().getName();
+        // 判断表是否包含标识自增列
+        DatabaseConnectorInstance db = (DatabaseConnectorInstance) commandConfig.getConnectorInstance();
+        List<Integer> result = db.execute(databaseTemplate -> databaseTemplate.queryForList(String.format(QUERY_TABLE_IDENTITY, tableName), Integer.class));
+        // 允许显式插入标识列的值
+        if (!CollectionUtils.isEmpty(result)) {
+            DatabaseConfig config = (DatabaseConfig) commandConfig.getConnectorConfig();
+            String insert = String.format(SET_TABLE_IDENTITY_ON, config.getSchema(), tableName)
+                    + targetCommand.get(ConnectorConstant.OPERTION_INSERT)
+                    + String.format(SET_TABLE_IDENTITY_OFF, config.getSchema(), tableName);
+            targetCommand.put(ConnectorConstant.OPERTION_INSERT, insert);
+        }
         return targetCommand;
     }
 

+ 2 - 2
dbsyncer-parser/src/main/java/org/dbsyncer/parser/impl/ParserComponentImpl.java

@@ -102,8 +102,8 @@ public class ParserComponentImpl implements ParserComponent {
                 }
             });
         }
-        final CommandConfig sourceConfig = new CommandConfig(sConnConfig.getConnectorType(), sTable, sConnConfig, tableGroup.getFilter());
-        final CommandConfig targetConfig = new CommandConfig(tConnConfig.getConnectorType(), tTable, tConnConfig, null);
+        final CommandConfig sourceConfig = new CommandConfig(sConnConfig.getConnectorType(), sTable, connectorFactory.connect(sConnConfig), tableGroup.getFilter());
+        final CommandConfig targetConfig = new CommandConfig(tConnConfig.getConnectorType(), tTable, connectorFactory.connect(tConnConfig), null);
         // 获取连接器同步参数
         return connectorFactory.getCommand(sourceConfig, targetConfig);
     }

+ 12 - 4
dbsyncer-sdk/src/main/java/org/dbsyncer/sdk/config/CommandConfig.java

@@ -1,5 +1,9 @@
+/**
+ * DBSyncer Copyright 2020-2024 All Rights Reserved.
+ */
 package org.dbsyncer.sdk.config;
 
+import org.dbsyncer.sdk.connector.ConnectorInstance;
 import org.dbsyncer.sdk.model.ConnectorConfig;
 import org.dbsyncer.sdk.model.Filter;
 import org.dbsyncer.sdk.model.Table;
@@ -21,13 +25,13 @@ public class CommandConfig {
 
     private List<Filter> filter;
 
-    private ConnectorConfig connectorConfig;
+    private ConnectorInstance connectorInstance;
 
-    public CommandConfig(String connectorType, Table table, ConnectorConfig connectorConfig, List<Filter> filter) {
+    public CommandConfig(String connectorType, Table table, ConnectorInstance connectorInstance, List<Filter> filter) {
         this.connectorType = connectorType;
         this.table = table;
         this.filter = filter;
-        this.connectorConfig = connectorConfig;
+        this.connectorInstance = connectorInstance;
     }
 
     public String getConnectorType() {
@@ -43,6 +47,10 @@ public class CommandConfig {
     }
 
     public ConnectorConfig getConnectorConfig() {
-        return connectorConfig;
+        return connectorInstance.getConfig();
+    }
+
+    public ConnectorInstance getConnectorInstance() {
+        return connectorInstance;
     }
 }