fix bug: oracle主键与PostgreSQL表的DDL

This commit is contained in:
inrgihc
2022-03-08 22:36:33 +08:00
parent 665903a287
commit 3268385b2a
5 changed files with 77 additions and 21 deletions

View File

@@ -28,10 +28,10 @@ public class DbConnectionCreateRequest {
public DatabaseConnectionEntity toDatabaseConnection() { public DatabaseConnectionEntity toDatabaseConnection() {
DatabaseConnectionEntity databaseConnectionEntity = new DatabaseConnectionEntity(); DatabaseConnectionEntity databaseConnectionEntity = new DatabaseConnectionEntity();
databaseConnectionEntity.setId(null); databaseConnectionEntity.setId(null);
databaseConnectionEntity.setName(name); databaseConnectionEntity.setName(name.trim());
databaseConnectionEntity.setType(type); databaseConnectionEntity.setType(type);
databaseConnectionEntity.setDriver(driver); databaseConnectionEntity.setDriver(driver.trim());
databaseConnectionEntity.setUrl(url); databaseConnectionEntity.setUrl(url.trim());
databaseConnectionEntity.setUsername(username); databaseConnectionEntity.setUsername(username);
databaseConnectionEntity.setPassword(password); databaseConnectionEntity.setPassword(password);

View File

@@ -29,10 +29,10 @@ public class DbConnectionUpdateRequest {
public DatabaseConnectionEntity toDatabaseConnection() { public DatabaseConnectionEntity toDatabaseConnection() {
DatabaseConnectionEntity databaseConnectionEntity = new DatabaseConnectionEntity(); DatabaseConnectionEntity databaseConnectionEntity = new DatabaseConnectionEntity();
databaseConnectionEntity.setId(id); databaseConnectionEntity.setId(id);
databaseConnectionEntity.setName(name); databaseConnectionEntity.setName(name.trim());
databaseConnectionEntity.setType(type); databaseConnectionEntity.setType(type);
databaseConnectionEntity.setDriver(driver); databaseConnectionEntity.setDriver(driver.trim());
databaseConnectionEntity.setUrl(url); databaseConnectionEntity.setUrl(url.trim());
databaseConnectionEntity.setUsername(username); databaseConnectionEntity.setUsername(username);
databaseConnectionEntity.setPassword(password); databaseConnectionEntity.setPassword(password);

View File

@@ -19,7 +19,10 @@ import com.gitee.dbswitch.core.model.ColumnMetaData;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/** /**
* 支持Greenplum数据库的元信息实现 * 支持Greenplum数据库的元信息实现
@@ -28,10 +31,18 @@ import java.util.List;
*/ */
public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabaseInterface { public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabaseInterface {
private static Set<String> systemSchemas = new HashSet<>();
private static final String SHOW_CREATE_VIEW_SQL = private static final String SHOW_CREATE_VIEW_SQL =
"SELECT pg_get_viewdef((select pg_class.relfilenode from pg_catalog.pg_class \n" "select pg_get_viewdef('\"%s\".\"%s\"', true)";
+ "join pg_catalog.pg_namespace on pg_class.relnamespace = pg_namespace.oid \n"
+ "where pg_namespace.nspname='%s' and pg_class.relname ='%s'),true) "; static {
systemSchemas.add("gp_toolkit");
systemSchemas.add("pg_aoseg");
systemSchemas.add("information_schema");
systemSchemas.add("pg_catalog");
systemSchemas.add("pg_bitmapindex");
}
public DatabaseGreenplumImpl() { public DatabaseGreenplumImpl() {
super("com.pivotal.jdbc.GreenplumDriver"); super("com.pivotal.jdbc.GreenplumDriver");
@@ -42,6 +53,14 @@ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabase
return DatabaseTypeEnum.GREENPLUM; return DatabaseTypeEnum.GREENPLUM;
} }
@Override
public List<String> querySchemaList() {
List<String> schemas = super.querySchemaList();
return schemas.stream()
.filter(s -> !systemSchemas.contains(s))
.collect(Collectors.toList());
}
@Override @Override
public String getTableDDL(String schemaName, String tableName) { public String getTableDDL(String schemaName, String tableName) {
String sql = PostgresqlConst.CREATE_TABLE_SQL_TPL String sql = PostgresqlConst.CREATE_TABLE_SQL_TPL
@@ -56,7 +75,9 @@ public class DatabaseGreenplumImpl extends AbstractDatabase implements IDatabase
} }
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new RuntimeException(e); //throw new RuntimeException(e);
// TODO: Greenplum的表的DDL获取方法
return e.getMessage();
} }
return null; return null;

View File

@@ -128,10 +128,10 @@ public class DatabaseOracleImpl extends AbstractDatabase implements IDatabaseInt
// 使主键失效alter table tableName disable primary key; // 使主键失效alter table tableName disable primary key;
// 使主键恢复alter table tableName enable primary key; // 使主键恢复alter table tableName enable primary key;
Set<String> ret = new HashSet<>(); Set<String> ret = new HashSet<>();
String sql = String.format("SELECT COLUMN_NAME FROM user_cons_columns " String sql = String.format(
+ "WHERE owner='%s' and constraint_name = " "SELECT col.COLUMN_NAME FROM all_cons_columns col INNER JOIN all_constraints con \n"
+ "(SELECT constraint_name FROM user_constraints WHERE table_name = '%s' " + "ON col.constraint_name=con.constraint_name AND col.OWNER =con.OWNER AND col.TABLE_NAME =con.TABLE_NAME \n"
+ "AND constraint_type = 'P' and STATUS='ENABLED') ", + "WHERE con.constraint_type = 'P' and con.STATUS='ENABLED' and con.owner='%s' AND con.table_name='%s'",
schemaName, tableName); schemaName, tableName);
try (PreparedStatement ps = this.connection.prepareStatement(sql); try (PreparedStatement ps = this.connection.prepareStatement(sql);
ResultSet rs = ps.executeQuery(); ResultSet rs = ps.executeQuery();

View File

@@ -20,7 +20,10 @@ import com.gitee.dbswitch.core.util.DDLFormatterUtils;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/** /**
* 支持PostgreSQL数据库的元信息实现 * 支持PostgreSQL数据库的元信息实现
@@ -29,10 +32,21 @@ import java.util.List;
*/ */
public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseInterface { public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseInterface {
private static final String SHOW_CREATE_VIEW_SQL = private static Set<String> systemSchemas = new HashSet<>();
private static final String SHOW_CREATE_VIEW_SQL_1 =
"SELECT pg_get_viewdef((select pg_class.relfilenode from pg_catalog.pg_class \n" "SELECT pg_get_viewdef((select pg_class.relfilenode from pg_catalog.pg_class \n"
+ "join pg_catalog.pg_namespace on pg_class.relnamespace = pg_namespace.oid \n" + "join pg_catalog.pg_namespace on pg_class.relnamespace = pg_namespace.oid \n"
+ "where pg_namespace.nspname='%s' and pg_class.relname ='%s'),true) "; + "where pg_namespace.nspname='%s' and pg_class.relname ='%s'),true) ";
private static final String SHOW_CREATE_VIEW_SQL_2 =
"select pg_get_viewdef('\"%s\".\"%s\"', true)";
static {
systemSchemas.add("pg_aoseg");
systemSchemas.add("information_schema");
systemSchemas.add("pg_catalog");
systemSchemas.add("pg_bitmapindex");
}
public DatabasePostgresImpl() { public DatabasePostgresImpl() {
super("org.postgresql.Driver"); super("org.postgresql.Driver");
@@ -43,6 +57,14 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI
return DatabaseTypeEnum.POSTGRESQL; return DatabaseTypeEnum.POSTGRESQL;
} }
@Override
public List<String> querySchemaList() {
List<String> schemas = super.querySchemaList();
return schemas.stream()
.filter(s -> !systemSchemas.contains(s))
.collect(Collectors.toList());
}
@Override @Override
public String getTableDDL(String schemaName, String tableName) { public String getTableDDL(String schemaName, String tableName) {
String sql = PostgresqlConst.CREATE_TABLE_SQL_TPL String sql = PostgresqlConst.CREATE_TABLE_SQL_TPL
@@ -57,7 +79,9 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI
} }
} }
} catch (SQLException e) { } catch (SQLException e) {
throw new RuntimeException(e); //throw new RuntimeException(e);
// 低版本的PostgreSQL的表的DDL获取方法
return e.getMessage();
} }
return null; return null;
@@ -65,12 +89,23 @@ public class DatabasePostgresImpl extends AbstractDatabase implements IDatabaseI
@Override @Override
public String getViewDDL(String schemaName, String tableName) { public String getViewDDL(String schemaName, String tableName) {
String sql = String.format(SHOW_CREATE_VIEW_SQL, schemaName, tableName); String sql = String.format(SHOW_CREATE_VIEW_SQL_1, schemaName, tableName);
try (Statement st = connection.createStatement()) { try (Statement st = connection.createStatement()) {
if (st.execute(sql)) { try {
try (ResultSet rs = st.getResultSet()) { if (st.execute(sql)) {
if (rs != null && rs.next()) { try (ResultSet rs = st.getResultSet()) {
return rs.getString(1); if (rs != null && rs.next()) {
return rs.getString(1);
}
}
}
} catch (SQLException se) {
String.format(SHOW_CREATE_VIEW_SQL_2, schemaName, tableName);
if (st.execute(sql)) {
try (ResultSet rs = st.getResultSet()) {
if (rs != null && rs.next()) {
return rs.getString(1);
}
} }
} }
} }