You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2021/02/09 07:32:47 UTC

[shardingsphere] branch master updated: Refactor SQLAuditEngine (#9397)

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

menghaoran 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 02dd369  Refactor SQLAuditEngine (#9397)
02dd369 is described below

commit 02dd36919cbba0ce1da9547a549b7b4f8e676ab1
Author: Juan Pan(Trista) <pa...@apache.org>
AuthorDate: Tue Feb 9 15:32:17 2021 +0800

    Refactor SQLAuditEngine (#9397)
    
    * Adjust packages
    
    * Refactor SQLAuditEngine
    
    * Refactor SQLAuditEngine
    
    * check style
---
 .../{SQLAuditEngine.java => SQLCheckEngine.java}   | 33 +++++++++++-----------
 ...{SQLAuditResult.java => SQLCheckException.java} | 16 +++++++----
 .../{SQLAuditResult.java => SQLCheckResult.java}   |  6 ++--
 .../{AuditSQLState.java => SQLCheckType.java}      | 15 +++++-----
 .../audit/{SQLAuditor.java => SQLChecker.java}     | 25 ++++++++++------
 .../infra/spi/ordered/OrderedSPIRegistry.java      |  9 +++++-
 .../infra/context/kernel/KernelProcessor.java      | 11 +-------
 .../statement/ShardingSpherePreparedStatement.java |  4 ++-
 .../core/statement/ShardingSphereStatement.java    |  2 ++
 .../text/TextProtocolBackendHandlerFactory.java    |  9 ++++++
 .../execute/MySQLComStmtExecuteExecutor.java       |  9 ++++++
 11 files changed, 84 insertions(+), 55 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditEngine.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckEngine.java
similarity index 56%
rename from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditEngine.java
rename to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckEngine.java
index 3edf790..60ceed2 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditEngine.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckEngine.java
@@ -17,42 +17,41 @@
 
 package org.apache.shardingsphere.infra.audit;
 
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.auth.Authentication;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.infra.spi.ordered.OrderedSPIRegistry;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
-import java.sql.SQLException;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 
 /**
- * SQL audit engine.
+ * SQL check engine.
  */
-public final class SQLAuditEngine {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class SQLCheckEngine {
     
     static {
-        ShardingSphereServiceLoader.register(SQLAuditor.class);
+        ShardingSphereServiceLoader.register(SQLChecker.class);
     }
     
     /**
-     * Audit SQL.
+     * Check SQL.
      * 
      * @param sqlStatement SQL statement
      * @param parameters SQL parameters
-     * @param schemaName schema name
-     * @param rules ShardingSphere rules
-     * @throws SQLException SQL exception
+     * @param metaData meta data
+     * @param auth auth
      */
-    @SuppressWarnings({"rawtypes", "unchecked"})
-    public void audit(final SQLStatement sqlStatement, final List<Object> parameters, final String schemaName, final Collection<ShardingSphereRule> rules) throws SQLException {
-        Map<ShardingSphereRule, SQLAuditor> auditors = OrderedSPIRegistry.getRegisteredServices(rules, SQLAuditor.class);
-        for (Entry<ShardingSphereRule, SQLAuditor> entry : auditors.entrySet()) {
-            SQLAuditResult auditResult = entry.getValue().audit(sqlStatement, parameters, schemaName, entry.getKey());
+    public static void check(final SQLStatement sqlStatement, final List<Object> parameters, final ShardingSphereMetaData metaData, final Authentication auth) {
+        Collection<SQLChecker> auditors = OrderedSPIRegistry.getRegisteredServices(SQLChecker.class);
+        for (SQLChecker each : auditors) {
+            SQLCheckResult auditResult = each.check(sqlStatement, parameters, metaData, auth);
             if (!auditResult.isPassed()) {
-                throw new SQLException(auditResult.getFailedReason(), AuditSQLState.COMMON_AUDIT_FAIL);
+                throw new SQLCheckException(each.getSQLCheckType(), auditResult.getErrorMessage());
             }
         }
     }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditResult.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckException.java
similarity index 63%
copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditResult.java
copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckException.java
index 953044d..ab4a663 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditResult.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckException.java
@@ -18,16 +18,20 @@
 package org.apache.shardingsphere.infra.audit;
 
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 
 /**
- * SQL audit result.
+ * SQL check exception.
  */
-@RequiredArgsConstructor
 @Getter
-public final class SQLAuditResult {
+public final class SQLCheckException extends ShardingSphereException {
     
-    private final boolean isPassed;
+    private static final long serialVersionUID = 4183020614721058122L;
     
-    private final String failedReason;
+    private final SQLCheckType sqlCheckType;
+    
+    public SQLCheckException(final SQLCheckType state, final String errorMessage) {
+        super(String.format("SQL %s checking failed. Error message: %s.", state.name(), errorMessage));
+        this.sqlCheckType = state;
+    }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditResult.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckResult.java
similarity index 91%
rename from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditResult.java
rename to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckResult.java
index 953044d..d832afb 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditResult.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckResult.java
@@ -21,13 +21,13 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
 /**
- * SQL audit result.
+ * SQL check result.
  */
 @RequiredArgsConstructor
 @Getter
-public final class SQLAuditResult {
+public final class SQLCheckResult {
     
     private final boolean isPassed;
     
-    private final String failedReason;
+    private final String errorMessage;
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/AuditSQLState.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckType.java
similarity index 74%
rename from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/AuditSQLState.java
rename to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckType.java
index 81adada..2ff3b10 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/AuditSQLState.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLCheckType.java
@@ -17,16 +17,15 @@
 
 package org.apache.shardingsphere.infra.audit;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
 
 /**
- * SQL state for audit fail.
+ * SQL check type.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class AuditSQLState {
-    
-    public static final String COMMON_AUDIT_FAIL = "AU001";
+@RequiredArgsConstructor
+public enum SQLCheckType {
+
+    AUTHENTICATION("authentication"), SQL_AUDIT("audit");
     
-    public static final int COMMON_VENDOR_CODE = 50000;
+    private final String name;
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditor.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLChecker.java
similarity index 66%
rename from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditor.java
rename to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLChecker.java
index fbdedf9..83d025e 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLAuditor.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/audit/SQLChecker.java
@@ -17,27 +17,34 @@
 
 package org.apache.shardingsphere.infra.audit;
 
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.auth.Authentication;
 import org.apache.shardingsphere.infra.spi.ordered.OrderedSPI;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.List;
 
 /**
- * SQL auditor.
+ * SQL checker.
  * 
- * @param <T> type of ShardingSphere rule
  */
-public interface SQLAuditor<T extends ShardingSphereRule> extends OrderedSPI<T> {
+public interface SQLChecker extends OrderedSPI {
     
     /**
-     * Audit SQL.
+     * Get SQL check type.
+     *
+     * @return sql check type
+     */
+    SQLCheckType getSQLCheckType();
+    
+    /**
+     * Check SQL.
      * 
      * @param sqlStatement SQL statement
      * @param parameters SQL parameters
-     * @param schemaName schema name
-     * @param rule ShardingSphere rule
-     * @return SQL audit result
+     * @param metaData meta data
+     * @param auth auth
+     * @return SQL check result
      */
-    SQLAuditResult audit(SQLStatement sqlStatement, List<Object> parameters, String schemaName, T rule);
+    SQLCheckResult check(SQLStatement sqlStatement, List<Object> parameters, ShardingSphereMetaData metaData, Authentication auth);
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/spi/ordered/OrderedSPIRegistry.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/spi/ordered/OrderedSPIRegistry.java
index 44e4f4d..567cb0d 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/spi/ordered/OrderedSPIRegistry.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/spi/ordered/OrderedSPIRegistry.java
@@ -67,7 +67,14 @@ public final class OrderedSPIRegistry {
         return result;
     }
     
-    private static <T extends OrderedSPI<?>> Collection<T> getRegisteredServices(final Class<T> orderedSPIClass) {
+    /**
+     * Get registered services.
+     *
+     * @param orderedSPIClass class of ordered SPI
+     * @param <T> type of ordered SPI class
+     * @return registered services
+     */
+    public static <T extends OrderedSPI<?>> Collection<T> getRegisteredServices(final Class<T> orderedSPIClass) {
         Map<Integer, T> result = new TreeMap<>();
         for (T each : ShardingSphereServiceLoader.newServiceInstances(orderedSPIClass)) {
             result.put(each.getOrder(), each);
diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java
index d336713..3a67487 100644
--- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java
+++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/kernel/KernelProcessor.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.infra.context.kernel;
 
-import org.apache.shardingsphere.infra.audit.SQLAuditEngine;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
@@ -30,8 +29,6 @@ import org.apache.shardingsphere.infra.rewrite.engine.result.SQLRewriteResult;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
 
-import java.sql.SQLException;
-
 /**
  * Kernel processor.
  */
@@ -44,10 +41,8 @@ public final class KernelProcessor {
      * @param metaData ShardingSphere meta data
      * @param props configuration properties
      * @return execution context
-     * @throws SQLException SQL exception
      */
-    public ExecutionContext generateExecutionContext(final LogicSQL logicSQL, final ShardingSphereMetaData metaData, final ConfigurationProperties props) throws SQLException {
-        audit(logicSQL, metaData);
+    public ExecutionContext generateExecutionContext(final LogicSQL logicSQL, final ShardingSphereMetaData metaData, final ConfigurationProperties props) {
         RouteContext routeContext = route(logicSQL, metaData, props);
         SQLRewriteResult rewriteResult = rewrite(logicSQL, metaData, props, routeContext);
         ExecutionContext result = createExecutionContext(logicSQL, metaData, routeContext, rewriteResult);
@@ -55,10 +50,6 @@ public final class KernelProcessor {
         return result;
     }
     
-    private void audit(final LogicSQL logicSQL, final ShardingSphereMetaData metaData) throws SQLException {
-        new SQLAuditEngine().audit(logicSQL.getSqlStatementContext().getSqlStatement(), logicSQL.getParameters(), metaData.getName(), metaData.getRuleMetaData().getRules());
-    }
-    
     private RouteContext route(final LogicSQL logicSQL, final ShardingSphereMetaData metaData, final ConfigurationProperties props) {
         return new SQLRouteEngine(metaData.getRuleMetaData().getRules(), props).route(logicSQL, metaData);
     }
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 0a277f1..49cbf82 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -31,6 +31,7 @@ import org.apache.shardingsphere.driver.jdbc.core.constant.SQLExceptionConstant;
 import org.apache.shardingsphere.driver.jdbc.core.resultset.GeneratedKeysResultSet;
 import org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet;
 import org.apache.shardingsphere.driver.jdbc.core.statement.metadata.ShardingSphereParameterMetaData;
+import org.apache.shardingsphere.infra.audit.SQLCheckEngine;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.segment.insert.keygen.GeneratedKeyContext;
@@ -353,8 +354,9 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
         return result;
     }
     
-    private ExecutionContext createExecutionContext() throws SQLException {
+    private ExecutionContext createExecutionContext() {
         LogicSQL logicSQL = createLogicSQL();
+        SQLCheckEngine.check(logicSQL.getSqlStatementContext().getSqlStatement(), logicSQL.getParameters(), metaDataContexts.getDefaultMetaData(), metaDataContexts.getAuthentication());
         ExecutionContext result = kernelProcessor.generateExecutionContext(logicSQL, metaDataContexts.getDefaultMetaData(), metaDataContexts.getProps());
         findGeneratedKey(result).ifPresent(generatedKey -> generatedValues.addAll(generatedKey.getGeneratedValues()));
         return result;
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 21b085b..d1344ef 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -29,6 +29,7 @@ import org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConne
 import org.apache.shardingsphere.driver.jdbc.core.constant.SQLExceptionConstant;
 import org.apache.shardingsphere.driver.jdbc.core.resultset.GeneratedKeysResultSet;
 import org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet;
+import org.apache.shardingsphere.infra.audit.SQLCheckEngine;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.segment.insert.keygen.GeneratedKeyContext;
@@ -389,6 +390,7 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
     private ExecutionContext createExecutionContext(final String sql) throws SQLException {
         clearStatements();
         LogicSQL logicSQL = createLogicSQL(sql);
+        SQLCheckEngine.check(logicSQL.getSqlStatementContext().getSqlStatement(), logicSQL.getParameters(), metaDataContexts.getDefaultMetaData(), metaDataContexts.getAuthentication());
         return kernelProcessor.generateExecutionContext(logicSQL, metaDataContexts.getDefaultMetaData(), metaDataContexts.getProps());
     }
     
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
index 0c0dd23..c702453 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
@@ -20,6 +20,8 @@ package org.apache.shardingsphere.proxy.backend.text;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.audit.SQLCheckEngine;
+import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
@@ -35,6 +37,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.tcl.TCLStatement;
 
 import java.sql.SQLException;
+import java.util.Collections;
 import java.util.Optional;
 
 /**
@@ -62,6 +65,7 @@ public final class TextProtocolBackendHandlerFactory {
             return ShardingCTLBackendHandlerFactory.newInstance(trimSQL, backendConnection);
         }
         SQLStatement sqlStatement = new ShardingSphereSQLParserEngine(getBackendDatabaseType(databaseType, backendConnection).getName()).parse(sql, false);
+        sqlCheck(backendConnection, sqlStatement);
         if (sqlStatement instanceof TCLStatement) {
             return TransactionBackendHandlerFactory.newInstance((TCLStatement) sqlStatement, sql, backendConnection);
         }
@@ -73,6 +77,11 @@ public final class TextProtocolBackendHandlerFactory {
         return databaseAdminBackendHandler.orElseGet(() -> DatabaseBackendHandlerFactory.newInstance(sqlStatement, sql, backendConnection));
     }
     
+    private static void sqlCheck(final BackendConnection backendConnection, final SQLStatement sqlStatement) {
+        MetaDataContexts contexts = ProxyContext.getInstance().getMetaDataContexts();
+        SQLCheckEngine.check(sqlStatement, Collections.emptyList(), contexts.getMetaData(backendConnection.getSchemaName()), contexts.getAuthentication());
+    }
+    
     private static DatabaseType getBackendDatabaseType(final DatabaseType defaultDatabaseType, final BackendConnection backendConnection) {
         return Strings.isNullOrEmpty(backendConnection.getSchemaName())
                 ? defaultDatabaseType : ProxyContext.getInstance().getMetaDataContexts().getMetaData(backendConnection.getSchemaName()).getResource().getDatabaseType();
diff --git a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
index 2a22b94..ef82d27 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
@@ -25,6 +25,8 @@ import org.apache.shardingsphere.db.protocol.mysql.packet.MySQLPacket;
 import org.apache.shardingsphere.db.protocol.mysql.packet.command.query.binary.execute.MySQLBinaryResultSetRowPacket;
 import org.apache.shardingsphere.db.protocol.mysql.packet.command.query.binary.execute.MySQLComStmtExecutePacket;
 import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
+import org.apache.shardingsphere.infra.audit.SQLCheckEngine;
+import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngine;
@@ -43,6 +45,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.stream.Collectors;
 
 /**
@@ -61,9 +64,15 @@ public final class MySQLComStmtExecuteExecutor implements QueryCommandExecutor {
         ShardingSphereSQLParserEngine sqlStatementParserEngine = new ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(
                 ProxyContext.getInstance().getMetaDataContexts().getMetaData(backendConnection.getSchemaName()).getResource().getDatabaseType()));
         SQLStatement sqlStatement = sqlStatementParserEngine.parse(packet.getSql(), true);
+        sqlCheck(backendConnection, sqlStatement);
         databaseCommunicationEngine = DatabaseCommunicationEngineFactory.getInstance().newBinaryProtocolInstance(sqlStatement, packet.getSql(), packet.getParameters(), backendConnection);
     }
     
+    private static void sqlCheck(final BackendConnection backendConnection, final SQLStatement sqlStatement) {
+        MetaDataContexts contexts = ProxyContext.getInstance().getMetaDataContexts();
+        SQLCheckEngine.check(sqlStatement, Collections.emptyList(), contexts.getMetaData(backendConnection.getSchemaName()), contexts.getAuthentication());
+    }
+    
     @Override
     public Collection<DatabasePacket<?>> execute() throws SQLException {
         ResponseHeader responseHeader = databaseCommunicationEngine.execute();