You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/06/27 07:26:26 UTC

[shardingsphere] branch master updated: Refactor and standardization of AlterRuleStatementUpdater (#11034)

This is an automated email from the ASF dual-hosted git repository.

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 53509a4  Refactor and standardization of AlterRuleStatementUpdater (#11034)
53509a4 is described below

commit 53509a498edf593f1a68e2332e9ddfb59f121762
Author: Liang Zhang <te...@163.com>
AuthorDate: Sun Jun 27 15:25:46 2021 +0800

    Refactor and standardization of AlterRuleStatementUpdater (#11034)
    
    * Refactor AlterEncryptRuleStatementUpdater
    
    * Refactor AlterReadwriteSplittingRuleStatementUpdater
    
    * Refactor AlterShardingBindingTableRuleStatementUpdater
    
    * Refactor AlterShardingBroadcastTableRuleStatementUpdater
    
    * Refactor AlterShardingTableRuleStatementUpdater
    
    * Refactor AlterShardingTableRuleStatementUpdater
    
    * Refactor AlterShardingBindingTableRuleStatementUpdater
    
    * Refactor CreateShardingBindingTableRuleStatementUpdater
---
 .../converter/ShardingRuleStatementConverter.java  |   4 +-
 .../parser/segment/BindingTableRuleSegment.java    |  15 ++-
 .../AlterShardingBindingTableRulesStatement.java   |  16 ++-
 .../CreateShardingBindingTableRulesStatement.java  |  16 ++-
 .../updater/AlterEncryptRuleStatementUpdater.java  |  62 +++++----
 ...lterReadwriteSplittingRuleStatementUpdater.java |  87 +++++++------
 ...erShardingBindingTableRuleStatementUpdater.java |  67 +++++-----
 ...ShardingBroadcastTableRuleStatementUpdater.java |  19 ++-
 .../AlterShardingTableRuleStatementUpdater.java    | 140 +++++++++++++--------
 ...teShardingBindingTableRuleStatementUpdater.java |  40 +++---
 .../AlterShardingTableRuleBackendHandlerTest.java  |   3 +-
 ...hardingBindingTableRulesBackendHandlerTest.java |  14 +--
 .../rdl/ShardingBindingTableRuleAssert.java        |   2 +-
 13 files changed, 282 insertions(+), 203 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
index af5a7f2..2100ab9 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/converter/ShardingRuleStatementConverter.java
@@ -73,7 +73,7 @@ public final class ShardingRuleStatementConverter {
     public static YamlShardingRuleConfiguration convert(final CreateShardingBindingTableRulesStatement sqlStatement) {
         YamlShardingRuleConfiguration result = new YamlShardingRuleConfiguration();
         for (BindingTableRuleSegment each : sqlStatement.getRules()) {
-            result.getBindingTables().add(each.getTables());
+            result.getBindingTables().add(each.getTableGroups());
         }
         return result;
     }
@@ -87,7 +87,7 @@ public final class ShardingRuleStatementConverter {
     public static YamlShardingRuleConfiguration convert(final AlterShardingBindingTableRulesStatement sqlStatement) {
         YamlShardingRuleConfiguration result = new YamlShardingRuleConfiguration();
         for (BindingTableRuleSegment each : sqlStatement.getRules()) {
-            result.getBindingTables().add(each.getTables());
+            result.getBindingTables().add(each.getTableGroups());
         }
         return result;
     }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
index e482d40..5ed41be 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/segment/BindingTableRuleSegment.java
@@ -21,6 +21,10 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
 /**
  * Binding table rule segment.
  */
@@ -28,5 +32,14 @@ import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 @Getter
 public final class BindingTableRuleSegment implements ASTNode {
     
-    private final String tables;
+    private final String tableGroups;
+    
+    /**
+     * Get binding tables.
+     * 
+     * @return binding tables
+     */
+    public Collection<String> getBindingTables() {
+        return Arrays.stream(tableGroups.split(",")).map(String::trim).collect(Collectors.toList());
+    }
 }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
index 37f6d97..b6fbd48 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/AlterShardingBindingTableRulesStatement.java
@@ -19,10 +19,11 @@ package org.apache.shardingsphere.sharding.distsql.parser.statement;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterRuleStatement;
+import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
 
 import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * Alter sharding binding table rules statement.
@@ -32,4 +33,17 @@ import java.util.Collection;
 public final class AlterShardingBindingTableRulesStatement extends AlterRuleStatement {
     
     private final Collection<BindingTableRuleSegment> rules;
+    
+    /**
+     * Get binding tables.
+     * 
+     * @return binding tables
+     */
+    public Collection<String> getBindingTables() {
+        Collection<String> result = new LinkedList<>();
+        for (BindingTableRuleSegment each : rules) {
+            result.addAll(each.getBindingTables());
+        }
+        return result;
+    }
 }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
index d1f2d94..3eca763 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-statement/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/statement/CreateShardingBindingTableRulesStatement.java
@@ -19,10 +19,11 @@ package org.apache.shardingsphere.sharding.distsql.parser.statement;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.CreateRuleStatement;
+import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
 
 import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * Create sharding binding table rules statement.
@@ -32,4 +33,17 @@ import java.util.Collection;
 public final class CreateShardingBindingTableRulesStatement extends CreateRuleStatement {
     
     private final Collection<BindingTableRuleSegment> rules;
+    
+    /**
+     * Get binding tables.
+     *
+     * @return binding tables
+     */
+    public Collection<String> getBindingTables() {
+        Collection<String> result = new LinkedList<>();
+        for (BindingTableRuleSegment each : rules) {
+            result.addAll(each.getBindingTables());
+        }
+        return result;
+    }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
index bd00057..d498638 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterEncryptRuleStatementUpdater.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
+import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.encrypt.api.config.EncryptRuleConfiguration;
 import org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.encrypt.distsql.parser.segment.EncryptRuleSegment;
@@ -34,6 +35,7 @@ import org.apache.shardingsphere.proxy.backend.exception.InvalidEncryptorsExcept
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
@@ -49,29 +51,34 @@ public final class AlterEncryptRuleStatementUpdater implements RDLUpdater<AlterE
     
     @Override
     public void checkSQLStatement(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
+        checkCurrentRuleConfiguration(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredRules(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredEncryptors(sqlStatement);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
         if (null == currentRuleConfig) {
-            throw new EncryptRuleNotExistedException(schemaName, getAlteredRuleNames(sqlStatement));
+            throw new EncryptRuleNotExistedException(schemaName, getToBeAlteredEncryptTableNames(sqlStatement));
         }
-        checkAlteredTables(schemaName, sqlStatement, currentRuleConfig);
-        checkEncryptors(sqlStatement);
     }
     
-    private void checkAlteredTables(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
-        Collection<String> existTables = getExistTables(currentRuleConfig);
-        Collection<String> notExistTables = getAlteredRuleNames(sqlStatement).stream().filter(each -> !existTables.contains(each)).collect(Collectors.toList());
-        if (!notExistTables.isEmpty()) {
-            throw new EncryptRuleNotExistedException(schemaName, notExistTables);
+    private void checkToBeAlteredRules(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
+        Collection<String> currentEncryptTableNames = currentRuleConfig.getTables().stream().map(EncryptTableRuleConfiguration::getName).collect(Collectors.toList());
+        Collection<String> notExistEncryptTableNames = getToBeAlteredEncryptTableNames(sqlStatement).stream().filter(each -> !currentEncryptTableNames.contains(each)).collect(Collectors.toList());
+        if (!notExistEncryptTableNames.isEmpty()) {
+            throw new EncryptRuleNotExistedException(schemaName, notExistEncryptTableNames);
         }
     }
     
-    private Collection<String> getExistTables(final EncryptRuleConfiguration encryptRuleConfig) {
-        return encryptRuleConfig.getTables().stream().map(EncryptTableRuleConfiguration::getName).collect(Collectors.toList());
+    private Collection<String> getToBeAlteredEncryptTableNames(final AlterEncryptRuleStatement sqlStatement) {
+        return sqlStatement.getRules().stream().map(EncryptRuleSegment::getTableName).collect(Collectors.toList());
     }
     
-    private void checkEncryptors(final AlterEncryptRuleStatement sqlStatement) {
+    private void checkToBeAlteredEncryptors(final AlterEncryptRuleStatement sqlStatement) {
         Collection<String> encryptors = new LinkedHashSet<>();
-        sqlStatement.getRules().forEach(each -> encryptors.addAll(each.getColumns().stream()
-                .map(column -> column.getEncryptor().getName()).collect(Collectors.toSet())));
+        for (EncryptRuleSegment each : sqlStatement.getRules()) {
+            encryptors.addAll(each.getColumns().stream().map(column -> column.getEncryptor().getName()).collect(Collectors.toSet()));
+        }
         Collection<String> invalidEncryptors = encryptors.stream().filter(
             each -> !TypedSPIRegistry.findRegisteredService(EncryptAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
         if (!invalidEncryptors.isEmpty()) {
@@ -81,24 +88,25 @@ public final class AlterEncryptRuleStatementUpdater implements RDLUpdater<AlterE
     
     @Override
     public void updateCurrentRuleConfiguration(final String schemaName, final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
-        EncryptRuleConfiguration alteredEncryptRuleConfiguration = new YamlRuleConfigurationSwapperEngine()
-                .swapToRuleConfigurations(Collections.singleton(EncryptRuleStatementConverter.convert(sqlStatement.getRules()))).stream()
-                .map(each -> (EncryptRuleConfiguration) each).findFirst().get();
-        drop(sqlStatement, currentRuleConfig);
-        currentRuleConfig.getTables().addAll(alteredEncryptRuleConfiguration.getTables());
-        currentRuleConfig.getEncryptors().putAll(alteredEncryptRuleConfiguration.getEncryptors());
+        dropRuleConfiguration(sqlStatement, currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
     }
     
-    private void drop(final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration encryptRuleConfig) {
-        getAlteredRuleNames(sqlStatement).forEach(each -> {
-            EncryptTableRuleConfiguration encryptTableRuleConfig = encryptRuleConfig.getTables().stream().filter(tableRule -> tableRule.getName().equals(each)).findAny().get();
-            encryptRuleConfig.getTables().remove(encryptTableRuleConfig);
-            encryptTableRuleConfig.getColumns().forEach(column -> encryptRuleConfig.getEncryptors().remove(column.getEncryptorName()));
-        });
+    private void dropRuleConfiguration(final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
+        for (String each : getToBeAlteredEncryptTableNames(sqlStatement)) {
+            Optional<EncryptTableRuleConfiguration> toBeRemovedEncryptTableRuleConfig = currentRuleConfig.getTables().stream().filter(tableRule -> tableRule.getName().equals(each)).findAny();
+            Preconditions.checkState(toBeRemovedEncryptTableRuleConfig.isPresent());
+            currentRuleConfig.getTables().remove(toBeRemovedEncryptTableRuleConfig.get());
+            toBeRemovedEncryptTableRuleConfig.get().getColumns().forEach(column -> currentRuleConfig.getEncryptors().remove(column.getEncryptorName()));
+        }
     }
     
-    private Collection<String> getAlteredRuleNames(final AlterEncryptRuleStatement sqlStatement) {
-        return sqlStatement.getRules().stream().map(EncryptRuleSegment::getTableName).collect(Collectors.toList());
+    private void addRuleConfiguration(final AlterEncryptRuleStatement sqlStatement, final EncryptRuleConfiguration currentRuleConfig) {
+        Optional<EncryptRuleConfiguration> toBeAlteredRuleConfig = new YamlRuleConfigurationSwapperEngine()
+                .swapToRuleConfigurations(Collections.singleton(EncryptRuleStatementConverter.convert(sqlStatement.getRules()))).stream().map(each -> (EncryptRuleConfiguration) each).findFirst();
+        Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+        currentRuleConfig.getTables().addAll(toBeAlteredRuleConfig.get().getTables());
+        currentRuleConfig.getEncryptors().putAll(toBeAlteredRuleConfig.get().getEncryptors());
     }
     
     @Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
index 0e98c41..8621309 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterReadwriteSplittingRuleStatementUpdater.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import org.apache.shardingsphere.infra.distsql.RDLUpdater;
 import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
@@ -36,8 +37,8 @@ import org.apache.shardingsphere.readwritesplitting.yaml.converter.ReadwriteSpli
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
+import java.util.Optional;
 import java.util.Properties;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -53,69 +54,73 @@ public final class AlterReadwriteSplittingRuleStatementUpdater implements RDLUpd
     @Override
     public void checkSQLStatement(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, 
                                   final ReadwriteSplittingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
+        checkCurrentRuleConfiguration(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredRules(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredResources(schemaName, sqlStatement, resource);
+        checkToBeAlteredLoadBalancer(sqlStatement);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
         if (null == currentRuleConfig) {
-            throw new ReadwriteSplittingRuleNotExistedException(schemaName, getAlteredRuleNames(sqlStatement));
+            throw new ReadwriteSplittingRuleNotExistedException(schemaName, getToBeAlteredRuleNames(sqlStatement));
+        }
+    }
+    
+    private void checkToBeAlteredRules(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+        Collection<String> currentRuleNames = currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
+        Collection<String> notExistedRuleNames = getToBeAlteredRuleNames(sqlStatement).stream().filter(each -> !currentRuleNames.contains(each)).collect(Collectors.toList());
+        if (!notExistedRuleNames.isEmpty()) {
+            throw new ReadwriteSplittingRuleNotExistedException(schemaName, notExistedRuleNames);
         }
-        check(schemaName, sqlStatement, getAlteredRuleNames(sqlStatement), currentRuleConfig, resource);
     }
     
-    private void check(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement,
-                       final Collection<String> alteredRuleNames, final ReadwriteSplittingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
-        checkAlteredRules(schemaName, alteredRuleNames, currentRuleConfig);
-        checkResources(schemaName, sqlStatement, resource);
-        checkLoadBalancer(sqlStatement);
+    private Collection<String> getToBeAlteredRuleNames(final AlterReadwriteSplittingRuleStatement sqlStatement) {
+        return sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toSet());
     }
     
-    private void checkAlteredRules(final String schemaName, final Collection<String> alteredRuleNames, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
-        Set<String> existRuleNames = currentRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
-        Collection<String> notExistRuleNames = alteredRuleNames.stream()
-                .filter(each -> !existRuleNames.contains(each)).collect(Collectors.toList());
-        if (!notExistRuleNames.isEmpty()) {
-            throw new ReadwriteSplittingRuleNotExistedException(schemaName, notExistRuleNames);
+    private void checkToBeAlteredLoadBalancer(final AlterReadwriteSplittingRuleStatement sqlStatement) {
+        Collection<String> invalidLoadBalances = sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getLoadBalancer).distinct()
+                .filter(each -> !TypedSPIRegistry.findRegisteredService(ReplicaLoadBalanceAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
+        if (!invalidLoadBalances.isEmpty()) {
+            throw new InvalidLoadBalancersException(invalidLoadBalances);
         }
     }
     
-    private void checkResources(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ShardingSphereResource resource) {
+    private void checkToBeAlteredResources(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ShardingSphereResource resource) {
         Collection<String> resources = new LinkedHashSet<>();
         sqlStatement.getRules().stream().filter(each -> Strings.isNullOrEmpty(each.getAutoAwareResource())).forEach(each -> {
             resources.add(each.getWriteDataSource());
             resources.addAll(each.getReadDataSources());
         });
-        Collection<String> notExistResources = resource.getNotExistedResources(resources);
-        if (!notExistResources.isEmpty()) {
-            throw new ResourceNotExistedException(schemaName, notExistResources);
-        }
-    }
-    
-    private void checkLoadBalancer(final AlterReadwriteSplittingRuleStatement sqlStatement) {
-        Collection<String> invalidLoadBalances = sqlStatement.getRules().stream().map(ReadwriteSplittingRuleSegment::getLoadBalancer).distinct()
-                .filter(each -> !TypedSPIRegistry.findRegisteredService(ReplicaLoadBalanceAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
-        if (!invalidLoadBalances.isEmpty()) {
-            throw new InvalidLoadBalancersException(invalidLoadBalances);
+        Collection<String> notExistedResources = resource.getNotExistedResources(resources);
+        if (!notExistedResources.isEmpty()) {
+            throw new ResourceNotExistedException(schemaName, notExistedResources);
         }
     }
     
     @Override
     public void updateCurrentRuleConfiguration(final String schemaName, final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
-        ReadwriteSplittingRuleConfiguration alterReadwriteSplittingRuleConfig = new YamlRuleConfigurationSwapperEngine()
-                .swapToRuleConfigurations(Collections.singletonList(ReadwriteSplittingRuleStatementConverter.convert(sqlStatement))).stream()
-                .map(each -> (ReadwriteSplittingRuleConfiguration) each).findFirst().get();
-        drop(sqlStatement, currentRuleConfig);
-        currentRuleConfig.getDataSources().addAll(alterReadwriteSplittingRuleConfig.getDataSources());
-        currentRuleConfig.getLoadBalancers().putAll(alterReadwriteSplittingRuleConfig.getLoadBalancers());
+        dropRuleConfiguration(sqlStatement, currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
     }
     
-    private void drop(final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration ruleConfig) {
-        getAlteredRuleNames(sqlStatement).forEach(each -> {
-            ReadwriteSplittingDataSourceRuleConfiguration dataSourceRuleConfig = ruleConfig.getDataSources().stream().filter(dataSource -> each.equals(dataSource.getName())).findAny().get();
-            ruleConfig.getDataSources().remove(dataSourceRuleConfig);
-            ruleConfig.getLoadBalancers().remove(dataSourceRuleConfig.getLoadBalancerName());
-        });
+    private void dropRuleConfiguration(final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+        for (String each : getToBeAlteredRuleNames(sqlStatement)) {
+            Optional<ReadwriteSplittingDataSourceRuleConfiguration> toBeRemovedDataSourceRuleConfig
+                    = currentRuleConfig.getDataSources().stream().filter(dataSource -> each.equals(dataSource.getName())).findAny();
+            Preconditions.checkState(toBeRemovedDataSourceRuleConfig.isPresent());
+            currentRuleConfig.getDataSources().remove(toBeRemovedDataSourceRuleConfig.get());
+            currentRuleConfig.getLoadBalancers().remove(toBeRemovedDataSourceRuleConfig.get().getLoadBalancerName());
+        }
     }
     
-    private Collection<String> getAlteredRuleNames(final AlterReadwriteSplittingRuleStatement sqlStatement) {
-        return sqlStatement.getRules()
-                .stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toSet());
+    private void addRuleConfiguration(final AlterReadwriteSplittingRuleStatement sqlStatement, final ReadwriteSplittingRuleConfiguration currentRuleConfig) {
+        Optional<ReadwriteSplittingRuleConfiguration> toBeAlteredRuleConfig = new YamlRuleConfigurationSwapperEngine()
+                .swapToRuleConfigurations(Collections.singletonList(ReadwriteSplittingRuleStatementConverter.convert(sqlStatement))).stream()
+                .map(each -> (ReadwriteSplittingRuleConfiguration) each).findFirst();
+        Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+        currentRuleConfig.getDataSources().addAll(toBeAlteredRuleConfig.get().getDataSources());
+        currentRuleConfig.getLoadBalancers().putAll(toBeAlteredRuleConfig.get().getLoadBalancers());
     }
     
     @Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
index 3d82a14..b722ab6 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBindingTableRuleStatementUpdater.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
-import com.google.common.base.Splitter;
 import org.apache.shardingsphere.infra.distsql.RDLUpdater;
 import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.proxy.backend.exception.DuplicateBindingTablesException;
@@ -31,7 +30,6 @@ import org.apache.shardingsphere.sharding.distsql.parser.statement.AlterSharding
 
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -42,55 +40,52 @@ public final class AlterShardingBindingTableRuleStatementUpdater implements RDLU
     @Override
     public void checkSQLStatement(final String schemaName, final AlterShardingBindingTableRulesStatement sqlStatement, 
                                   final ShardingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
+        checkCurrentRuleConfiguration(schemaName, currentRuleConfig);
+        checkToBeAlertedBindingTables(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredDuplicateBindingTables(sqlStatement);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final ShardingRuleConfiguration currentRuleConfig) {
         if (null == currentRuleConfig) {
             throw new ShardingBindingTableRuleNotExistsException(schemaName);
         }
-        Collection<String> invalidBindingTables = new HashSet<>();
-        Collection<String> existLogicTables = getLogicTables(currentRuleConfig);
-        Collection<String> bindingTables = ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables();
-        for (String bindingTable : bindingTables) {
-            for (String logicTable : Splitter.on(",").splitToList(bindingTable)) {
-                if (!existLogicTables.contains(logicTable.trim())) {
-                    invalidBindingTables.add(logicTable);
-                }
-            }
-        }
-        if (!invalidBindingTables.isEmpty()) {
-            throw new ShardingTableRuleNotExistedException(schemaName, invalidBindingTables);
-        }
-        Collection<String> duplicateBindingTables = bindingTables.stream().filter(distinct()).collect(Collectors.toList());
-        if (!duplicateBindingTables.isEmpty()) {
-            throw new DuplicateBindingTablesException(duplicateBindingTables);
-        }
     }
     
-    @Override
-    public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
-        Collection<String> bindingTableGroups = currentRuleConfig.getBindingTableGroups();
-        bindingTableGroups.clear();
-        bindingTableGroups.addAll(ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables());
+    private void checkToBeAlertedBindingTables(final String schemaName, final AlterShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        Collection<String> currentLogicTables = getCurrentLogicTables(currentRuleConfig);
+        Collection<String> notExistedBindingTables = sqlStatement.getBindingTables().stream().filter(each -> !currentLogicTables.contains(each)).collect(Collectors.toSet());
+        if (!notExistedBindingTables.isEmpty()) {
+            throw new ShardingTableRuleNotExistedException(schemaName, notExistedBindingTables);
+        }
     }
     
-    private Collection<String> getLogicTables(final ShardingRuleConfiguration currentRuleConfig) {
+    private Collection<String> getCurrentLogicTables(final ShardingRuleConfiguration currentRuleConfig) {
         Collection<String> result = new HashSet<>();
         result.addAll(currentRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toSet()));
         result.addAll(currentRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toSet()));
         return result;
     }
     
-    private Predicate<String> distinct() {
-        Collection<String> tables = new HashSet<>();
-        return table -> notEquals(table, tables);
+    private void checkToBeAlteredDuplicateBindingTables(final AlterShardingBindingTableRulesStatement sqlStatement) {
+        Collection<String> toBeAlteredBindingTables = new HashSet<>();
+        Collection<String> duplicateBindingTables = sqlStatement.getBindingTables().stream().filter(each -> !toBeAlteredBindingTables.add(each)).collect(Collectors.toSet());
+        if (!duplicateBindingTables.isEmpty()) {
+            throw new DuplicateBindingTablesException(duplicateBindingTables);
+        }
     }
     
-    private boolean notEquals(final String table, final Collection<String> tables) {
-        for (String each : tables) {
-            if (table.equals(each) || (table.length() == each.length() && Splitter.on(",").splitToList(each).containsAll(Splitter.on(",").splitToList(table)))) {
-                return true;
-            }
-        }
-        tables.add(table);
-        return false;
+    @Override
+    public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        dropRuleConfiguration(currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
+    }
+    
+    private void dropRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig) {
+        currentRuleConfig.getBindingTableGroups().clear();
+    }
+    
+    private void addRuleConfiguration(final AlterShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        currentRuleConfig.getBindingTableGroups().addAll(ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables());
     }
     
     @Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
index 38b2c50..8f2f43d 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingBroadcastTableRuleStatementUpdater.java
@@ -23,8 +23,6 @@ import org.apache.shardingsphere.proxy.backend.exception.ShardingBroadcastTableR
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import org.apache.shardingsphere.sharding.distsql.parser.statement.AlterShardingBroadcastTableRulesStatement;
 
-import java.util.Collection;
-
 /**
  * Alter sharding broadcast table rule statement updater.
  */
@@ -33,6 +31,10 @@ public final class AlterShardingBroadcastTableRuleStatementUpdater implements RD
     @Override
     public void checkSQLStatement(final String schemaName, final AlterShardingBroadcastTableRulesStatement sqlStatement, 
                                   final ShardingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
+        checkCurrentRuleConfiguration(schemaName, currentRuleConfig);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final ShardingRuleConfiguration currentRuleConfig) {
         if (null == currentRuleConfig) {
             throw new ShardingBroadcastTableRuleNotExistsException(schemaName);
         }
@@ -40,9 +42,16 @@ public final class AlterShardingBroadcastTableRuleStatementUpdater implements RD
     
     @Override
     public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingBroadcastTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
-        Collection<String> broadcastTables = currentRuleConfig.getBroadcastTables();
-        broadcastTables.clear();
-        broadcastTables.addAll(sqlStatement.getTables());
+        dropRuleConfiguration(currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
+    }
+    
+    private void dropRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig) {
+        currentRuleConfig.getBroadcastTables().clear();
+    }
+    
+    private void addRuleConfiguration(final AlterShardingBroadcastTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        currentRuleConfig.getBroadcastTables().addAll(sqlStatement.getTables());
     }
     
     @Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
index 2fee8ab..7d574b1 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/AlterShardingTableRuleStatementUpdater.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
+import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.infra.distsql.RDLUpdater;
 import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
@@ -41,7 +42,7 @@ import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.Map.Entry;
-import java.util.Objects;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
@@ -59,84 +60,113 @@ public final class AlterShardingTableRuleStatementUpdater implements RDLUpdater<
     @Override
     public void checkSQLStatement(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, 
                                   final ShardingRuleConfiguration currentRuleConfig, final ShardingSphereResource resource) {
-        Collection<String> notExistResources = resource.getNotExistedResources(getResources(sqlStatement));
+        checkCurrentRuleConfiguration(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredResources(schemaName, sqlStatement, resource);
+        checkToBeAlteredShardingTables(schemaName, sqlStatement, currentRuleConfig);
+        checkToBeAlteredShardingAlgorithm(sqlStatement);
+        checkToBeAlteredKeyGenerators(sqlStatement);
+        checkToBeAlteredDuplicateShardingTables(sqlStatement);
+    }
+    
+    private void checkCurrentRuleConfiguration(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        if (null == currentRuleConfig) {
+            throw new ShardingTableRuleNotExistedException(schemaName, getToBeAlteredTableNames(sqlStatement));
+        }
+    }
+    
+    private Collection<String> getToBeAlteredTableNames(final AlterShardingTableRuleStatement sqlStatement) {
+        return sqlStatement.getRules().stream().map(TableRuleSegment::getLogicTable).collect(Collectors.toList());
+    }
+    
+    private void checkToBeAlteredResources(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingSphereResource resource) {
+        Collection<String> notExistResources = resource.getNotExistedResources(getToBeAlteredResources(sqlStatement));
         if (!notExistResources.isEmpty()) {
             throw new ResourceNotExistedException(schemaName, notExistResources);
         }
-        Collection<String> duplicateTables = getDuplicateTables(sqlStatement);
-        if (!duplicateTables.isEmpty()) {
-            throw new DuplicateTablesException(duplicateTables);
-        }
-        Collection<String> alteredTables = getAlteredTables(sqlStatement);
-        if (null == currentRuleConfig) {
-            throw new ShardingTableRuleNotExistedException(schemaName, alteredTables);
-        }
-        Collection<String> existTables = getShardingTables(currentRuleConfig);
-        Collection<String> notExistTables = alteredTables.stream().filter(each -> !existTables.contains(each)).collect(Collectors.toList());
-        if (!notExistTables.isEmpty()) {
-            throw new ShardingTableRuleNotExistedException(schemaName, notExistTables);
+    }
+    
+    private Collection<String> getToBeAlteredResources(final AlterShardingTableRuleStatement sqlStatement) {
+        Collection<String> result = new LinkedHashSet<>();
+        sqlStatement.getRules().forEach(each -> result.addAll(each.getDataSources()));
+        return result;
+    }
+    
+    private void checkToBeAlteredShardingTables(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        Collection<String> currentShardingTables = getCurrentShardingTables(currentRuleConfig);
+        Collection<String> notExistedShardingTables = getToBeAlteredTableNames(sqlStatement).stream().filter(each -> !currentShardingTables.contains(each)).collect(Collectors.toList());
+        if (!notExistedShardingTables.isEmpty()) {
+            throw new ShardingTableRuleNotExistedException(schemaName, notExistedShardingTables);
         }
-        Collection<String> invalidTableAlgorithms = sqlStatement.getRules().stream().map(each -> each.getTableStrategy().getName()).distinct()
+    }
+    
+    private Collection<String> getCurrentShardingTables(final ShardingRuleConfiguration currentRuleConfig) {
+        Collection<String> result = new LinkedList<>();
+        result.addAll(currentRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
+        result.addAll(currentRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
+        return result;
+    }
+    
+    private void checkToBeAlteredShardingAlgorithm(final AlterShardingTableRuleStatement sqlStatement) {
+        Collection<String> notExistedShardingAlgorithms = sqlStatement.getRules().stream().map(each -> each.getTableStrategy().getName()).distinct()
                 .filter(each -> !TypedSPIRegistry.findRegisteredService(ShardingAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
-        if (!invalidTableAlgorithms.isEmpty()) {
-            throw new InvalidShardingAlgorithmsException(invalidTableAlgorithms);
+        if (!notExistedShardingAlgorithms.isEmpty()) {
+            throw new InvalidShardingAlgorithmsException(notExistedShardingAlgorithms);
         }
-        Collection<String> invalidKeyGenerators = getKeyGenerators(sqlStatement).stream()
+    }
+    
+    private void checkToBeAlteredKeyGenerators(final AlterShardingTableRuleStatement sqlStatement) {
+        Collection<String> notExistedKeyGenerators = getToBeAlteredKeyGenerators(sqlStatement).stream().distinct()
                 .filter(each -> !TypedSPIRegistry.findRegisteredService(KeyGenerateAlgorithm.class, each, new Properties()).isPresent()).collect(Collectors.toList());
-        if (!invalidKeyGenerators.isEmpty()) {
-            throw new InvalidKeyGeneratorsException(invalidKeyGenerators);
+        if (!notExistedKeyGenerators.isEmpty()) {
+            throw new InvalidKeyGeneratorsException(notExistedKeyGenerators);
         }
     }
     
-    @Override
-    public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
-        ShardingRuleConfiguration alteredShardingRuleConfig = new YamlRuleConfigurationSwapperEngine()
-                .swapToRuleConfigurations(Collections.singletonList(ShardingRuleStatementConverter.convert(sqlStatement))).stream().map(each -> (ShardingRuleConfiguration) each).findFirst().get();
-        drop(sqlStatement, currentRuleConfig);
-        currentRuleConfig.getAutoTables().addAll(alteredShardingRuleConfig.getAutoTables());
-        currentRuleConfig.getShardingAlgorithms().putAll(alteredShardingRuleConfig.getShardingAlgorithms());
-        currentRuleConfig.getKeyGenerators().putAll(alteredShardingRuleConfig.getKeyGenerators());
-    }
-    
-    private void drop(final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
-        getAlteredTables(sqlStatement).forEach(each -> {
-            ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig = currentRuleConfig.getAutoTables().stream().filter(tableRule -> each.equals(tableRule.getLogicTable())).findAny().get();
-            currentRuleConfig.getAutoTables().remove(shardingAutoTableRuleConfig);
-            currentRuleConfig.getShardingAlgorithms().remove(shardingAutoTableRuleConfig.getShardingStrategy().getShardingAlgorithmName());
-            if (Objects.nonNull(shardingAutoTableRuleConfig.getKeyGenerateStrategy())) {
-                currentRuleConfig.getKeyGenerators().remove(shardingAutoTableRuleConfig.getKeyGenerateStrategy().getKeyGeneratorName());
-            }
-        });
+    private Collection<String> getToBeAlteredKeyGenerators(final AlterShardingTableRuleStatement sqlStatement) {
+        return sqlStatement.getRules().stream().filter(each -> null != each.getKeyGenerateStrategy()).map(each -> each.getKeyGenerateStrategy().getName()).collect(Collectors.toSet());
+    }
+    
+    private void checkToBeAlteredDuplicateShardingTables(final AlterShardingTableRuleStatement sqlStatement) {
+        Collection<String> duplicateTables = getDuplicateTables(sqlStatement);
+        if (!duplicateTables.isEmpty()) {
+            throw new DuplicateTablesException(duplicateTables);
+        }
     }
     
     private Collection<String> getDuplicateTables(final AlterShardingTableRuleStatement sqlStatement) {
         return sqlStatement.getRules().stream()
-                .collect(Collectors.toMap(TableRuleSegment::getLogicTable, e -> 1, Integer::sum))
+                .collect(Collectors.toMap(TableRuleSegment::getLogicTable, entry -> 1, Integer::sum))
                 .entrySet().stream()
                 .filter(entry -> entry.getValue() > 1)
                 .map(Entry::getKey)
                 .collect(Collectors.toList());
     }
     
-    private Collection<String> getAlteredTables(final AlterShardingTableRuleStatement sqlStatement) {
-        return sqlStatement.getRules().stream().map(TableRuleSegment::getLogicTable).collect(Collectors.toList());
-    }
-    
-    private Collection<String> getShardingTables(final ShardingRuleConfiguration shardingRuleConfig) {
-        Collection<String> result = new LinkedList<>();
-        result.addAll(shardingRuleConfig.getTables().stream().map(ShardingTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
-        result.addAll(shardingRuleConfig.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getLogicTable).collect(Collectors.toList()));
-        return result;
+    @Override
+    public void updateCurrentRuleConfiguration(final String schemaName, final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        dropRuleConfiguration(sqlStatement, currentRuleConfig);
+        addRuleConfiguration(sqlStatement, currentRuleConfig);
     }
     
-    private Collection<String> getResources(final AlterShardingTableRuleStatement sqlStatement) {
-        Collection<String> result = new LinkedHashSet<>();
-        sqlStatement.getRules().forEach(each -> result.addAll(each.getDataSources()));
-        return result;
+    private void dropRuleConfiguration(final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        for (String each : getToBeAlteredTableNames(sqlStatement)) {
+            Optional<ShardingAutoTableRuleConfiguration> shardingAutoTableRuleConfig = currentRuleConfig.getAutoTables().stream().filter(tableRule -> each.equals(tableRule.getLogicTable())).findAny();
+            Preconditions.checkState(shardingAutoTableRuleConfig.isPresent());
+            currentRuleConfig.getAutoTables().remove(shardingAutoTableRuleConfig.get());
+            currentRuleConfig.getShardingAlgorithms().remove(shardingAutoTableRuleConfig.get().getShardingStrategy().getShardingAlgorithmName());
+            if (null != shardingAutoTableRuleConfig.get().getKeyGenerateStrategy()) {
+                currentRuleConfig.getKeyGenerators().remove(shardingAutoTableRuleConfig.get().getKeyGenerateStrategy().getKeyGeneratorName());
+            }
+        }
     }
     
-    private Collection<String> getKeyGenerators(final AlterShardingTableRuleStatement sqlStatement) {
-        return sqlStatement.getRules().stream().filter(each -> Objects.nonNull(each.getKeyGenerateStrategy())).map(each -> each.getKeyGenerateStrategy().getName()).collect(Collectors.toSet());
+    private void addRuleConfiguration(final AlterShardingTableRuleStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        Optional<ShardingRuleConfiguration> toBeAlteredRuleConfig = new YamlRuleConfigurationSwapperEngine()
+                .swapToRuleConfigurations(Collections.singleton(ShardingRuleStatementConverter.convert(sqlStatement))).stream().map(each -> (ShardingRuleConfiguration) each).findFirst();
+        Preconditions.checkState(toBeAlteredRuleConfig.isPresent());
+        currentRuleConfig.getAutoTables().addAll(toBeAlteredRuleConfig.get().getAutoTables());
+        currentRuleConfig.getShardingAlgorithms().putAll(toBeAlteredRuleConfig.get().getShardingAlgorithms());
+        currentRuleConfig.getKeyGenerators().putAll(toBeAlteredRuleConfig.get().getKeyGenerators());
     }
     
     @Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
index 72354bf..bb4b23d 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/updater/CreateShardingBindingTableRuleStatementUpdater.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.impl.updater;
 
-import com.google.common.base.Splitter;
 import org.apache.shardingsphere.infra.distsql.RDLUpdater;
 import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.proxy.backend.exception.DuplicateBindingTablesException;
@@ -30,9 +29,9 @@ import org.apache.shardingsphere.sharding.converter.ShardingRuleStatementConvert
 import org.apache.shardingsphere.sharding.distsql.parser.statement.CreateShardingBindingTableRulesStatement;
 import org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /**
@@ -48,22 +47,16 @@ public final class CreateShardingBindingTableRuleStatementUpdater implements RDL
         }
         Collection<String> invalidBindingTables = new HashSet<>();
         Collection<String> existLogicTables = getLogicTables(currentRuleConfig);
-        Collection<String> bindingTables = ShardingRuleStatementConverter.convert(sqlStatement).getBindingTables();
-        for (String bindingTable : bindingTables) {
-            for (String logicTable : Splitter.on(",").splitToList(bindingTable)) {
-                if (!existLogicTables.contains(logicTable.trim())) {
-                    invalidBindingTables.add(logicTable);
-                }
+        Collection<String> bindingTables = sqlStatement.getBindingTables();
+        for (String each : bindingTables) {
+            if (!existLogicTables.contains(each)) {
+                invalidBindingTables.add(each);
             }
         }
         if (!invalidBindingTables.isEmpty()) {
             throw new ShardingTableRuleNotExistedException(schemaName, invalidBindingTables);
         }
-        bindingTables.addAll(currentRuleConfig.getBindingTableGroups());
-        Collection<String> duplicateBindingTables = bindingTables.stream().filter(distinct()).collect(Collectors.toList());
-        if (!duplicateBindingTables.isEmpty()) {
-            throw new DuplicateBindingTablesException(duplicateBindingTables);
-        }
+        checkToBeCreatedDuplicateBindingTables(sqlStatement, currentRuleConfig);
     }
     
     private Collection<String> getLogicTables(final ShardingRuleConfiguration currentRuleConfig) {
@@ -73,20 +66,17 @@ public final class CreateShardingBindingTableRuleStatementUpdater implements RDL
         return result;
     }
     
-    private Predicate<String> distinct() {
-        Collection<String> tables = new HashSet<>();
-        return table -> notEquals(table, tables);
+    private void checkToBeCreatedDuplicateBindingTables(final CreateShardingBindingTableRulesStatement sqlStatement, final ShardingRuleConfiguration currentRuleConfig) {
+        Collection<String> toBeCreatedBindingTables = new HashSet<>();
+        Collection<String> duplicateBindingTables = sqlStatement.getBindingTables().stream().filter(each -> !toBeCreatedBindingTables.add(each)).collect(Collectors.toSet());
+        duplicateBindingTables.addAll(getCurrentBindingTables(currentRuleConfig).stream().filter(each -> !toBeCreatedBindingTables.add(each)).collect(Collectors.toSet()));
+        if (!duplicateBindingTables.isEmpty()) {
+            throw new DuplicateBindingTablesException(duplicateBindingTables);
+        }
     }
     
-    private boolean notEquals(final String table, final Collection<String> tables) {
-        for (String each : tables) {
-            if (table.equals(each) || (table.length() == each.length() && Splitter.on(",").splitToList(each)
-                    .containsAll(Splitter.on(",").splitToList(table)))) {
-                return true;
-            }
-        }
-        tables.add(table);
-        return false;
+    private Collection<String> getCurrentBindingTables(final ShardingRuleConfiguration currentRuleConfig) {
+        return currentRuleConfig.getBindingTableGroups().stream().flatMap(each -> Arrays.stream(each.split(","))).map(String::trim).collect(Collectors.toList());
     }
     
     @Override
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
index 161d5d6..639a69f 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/AlterShardingTableRuleBackendHandlerTest.java
@@ -109,7 +109,8 @@ public final class AlterShardingTableRuleBackendHandlerTest {
     
     @Test(expected = DuplicateTablesException.class)
     public void assertExecuteWithDuplicateTablesInRDL() {
-        TableRuleSegment tableRuleSegment = new TableRuleSegment("t_order", Collections.emptyList(), null, null, null, null);
+        TableRuleSegment tableRuleSegment = new TableRuleSegment("t_order", Collections.emptyList(), null, new AlgorithmSegment("hash_mod", new Properties()), null, null);
+        when(ruleMetaData.getConfigurations()).thenReturn(buildShardingConfigurations());
         when(sqlStatement.getRules()).thenReturn(Arrays.asList(tableRuleSegment, tableRuleSegment));
         handler.execute("test", sqlStatement);
     }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
index 43ae8c8..bffc260 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/impl/CreateShardingBindingTableRulesBackendHandlerTest.java
@@ -117,13 +117,13 @@ public final class CreateShardingBindingTableRulesBackendHandlerTest {
     }
     
     private ShardingRuleConfiguration buildShardingBindingTableRuleConfiguration() {
-        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
-        shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_order"));
-        shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_order_item"));
-        shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_1"));
-        shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("t_2"));
-        shardingRuleConfig.getBindingTableGroups().add("t_order,t_order_item");
-        return shardingRuleConfig;
+        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+        result.getTables().add(new ShardingTableRuleConfiguration("t_order"));
+        result.getTables().add(new ShardingTableRuleConfiguration("t_order_item"));
+        result.getTables().add(new ShardingTableRuleConfiguration("t_1"));
+        result.getTables().add(new ShardingTableRuleConfiguration("t_2"));
+        result.getBindingTableGroups().add("t_order,t_order_item");
+        return result;
     }
     
     private CreateShardingBindingTableRulesStatement buildShardingTableRuleStatement() {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
index 33ae1c9..c6e68bd 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/distsql/rdl/ShardingBindingTableRuleAssert.java
@@ -47,7 +47,7 @@ public final class ShardingBindingTableRuleAssert {
         } else {
             assertNotNull(assertContext.getText("Actual should exist."), actual);
             assertThat(assertContext.getText(String.format("`%s`'s sharding binding table rule segment assertion error: ",
-                    actual.getClass().getSimpleName())), actual.getTables(), is(expected.getTables()));
+                    actual.getClass().getSimpleName())), actual.getTableGroups(), is(expected.getTables()));
         }
     }
 }