fix: sqlserver table sync incomplete

This commit is contained in:
vran 2022-05-11 11:38:40 +08:00
parent 5459223162
commit 646dce4172
1 changed files with 81 additions and 42 deletions

View File

@ -12,9 +12,7 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.*;
@RequiredArgsConstructor
@Slf4j
@ -30,58 +28,31 @@ public class SqlServerTableMetaProvider implements TableMetaProvider {
@Override
public List<TableMeta> selectTables(Connection connection, Condition condition) {
String sql = "SELECT sys.objects.name AS TABLE_NAME,\n"
+ " sys.objects.type_desc AS TABLE_TYPE,\n"
+ " CAST(extended_properties.value AS NVARCHAR(500)) AS REMARKS\n"
+ "FROM sys.objects\n"
+ " LEFT JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id\n"
+ " LEFT JOIN sys.extended_properties "
+ "ON sys.objects.object_id = sys.extended_properties.major_id\n"
+ "WHERE (type = 'U' OR type = 'V')\n"
+ " AND sys.extended_properties.minor_id = 0\n"
+ " AND sys.schemas.name LIKE ?;\n";
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, condition.getSchemaName());
ResultSet results = preparedStatement.executeQuery();
return doSelect(results, connection, condition);
} catch (SQLException e) {
log.warn("get table meta failed {}", e.getMessage());
if (log.isDebugEnabled()) {
log.debug("get table meta failed", e);
}
return Collections.emptyList();
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// ignore
}
}
}
return doSelect(connection, condition);
}
private List<TableMeta> doSelect(ResultSet tablesResult,
Connection connection,
Condition condition) throws SQLException {
private List<TableMeta> doSelect(Connection connection, Condition condition) {
List<TableMeta> tableMetas = new ArrayList<>();
String databaseName = condition.getDatabaseName();
Map<String, String> tableNameAndComment = tableNameAndCommentMap(connection, condition);
ResultSet tablesResult = null;
try {
tablesResult = connection.getMetaData()
.getTables(databaseName, condition.getSchemaName(), null, new String[]{"TABLE"});
while (tablesResult.next()) {
String tableName = tablesResult.getString("TABLE_NAME");
if (condition.tableIsIgnored(tableName)) {
if (log.isWarnEnabled()) {
log.warn("ignored table: " + condition.getSchemaName() + "." + tableName);
if (log.isDebugEnabled()) {
log.debug("ignored table: " + databaseName + "." + tableName);
}
} else {
String tableType = tablesResult.getString("TABLE_TYPE");
String tableComment = tablesResult.getString("REMARKS");
String tableComment = tableNameAndComment.getOrDefault(tableName, "");
TableCondition tableCondition = TableCondition.of(condition, tableName);
List<ColumnMeta> columns = columnMetaProvider.selectColumns(connection, tableCondition);
if (columns.isEmpty()) {
if (log.isWarnEnabled()) {
log.warn("ignored table: " + condition.getSchemaName() + "." + tableName
log.warn("ignored table: " + databaseName + "." + tableName
+ ", caused by get empty columns");
}
continue;
@ -98,10 +69,78 @@ public class SqlServerTableMetaProvider implements TableMetaProvider {
tableMetas.add(tableMeta);
}
}
} catch (SQLException e) {
log.error("select tables error", e);
throw new IllegalStateException(e);
} finally {
tablesResult.close();
if (tablesResult != null) {
try {
tablesResult.close();
} catch (SQLException e) {
// ignore
}
}
}
return tableMetas;
}
public Map<String, String> tableNameAndCommentMap(Connection connection, Condition condition) {
String sql = "SELECT sys.objects.name AS TABLE_NAME,\n"
+ " sys.objects.type_desc AS TABLE_TYPE,\n"
+ " CAST(extended_properties.value AS NVARCHAR(500)) AS REMARKS\n"
+ "FROM sys.objects\n"
+ " LEFT JOIN sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id\n"
+ " LEFT JOIN sys.extended_properties "
+ "ON sys.objects.object_id = sys.extended_properties.major_id\n"
+ "WHERE (type = 'U' OR type = 'V')\n"
+ " AND sys.extended_properties.minor_id = 0\n"
+ " AND sys.schemas.name LIKE ?;\n";
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, condition.getSchemaName());
ResultSet results = preparedStatement.executeQuery();
return tableNameAndCommentMap(results, connection, condition);
} catch (SQLException e) {
log.warn("get table meta failed {}", e.getMessage());
if (log.isDebugEnabled()) {
log.debug("get table meta failed", e);
}
return Collections.emptyMap();
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// ignore
}
}
}
}
private Map<String, String> tableNameAndCommentMap(ResultSet tablesResult,
Connection connection,
Condition condition) throws SQLException {
Map<String, String> tableNameAndCommentMap = new HashMap<>();
try {
while (tablesResult.next()) {
String tableName = tablesResult.getString("TABLE_NAME");
if (condition.tableIsIgnored(tableName)) {
if (log.isDebugEnabled()) {
log.debug("ignored table: " + condition.getSchemaName() + "." + tableName);
}
} else {
String tableComment = tablesResult.getString("REMARKS");
if (!Objects.isNull(tableComment)) {
tableNameAndCommentMap.put(tableName, tableComment);
}
}
}
} finally {
tablesResult.close();
}
return tableNameAndCommentMap;
}
}