feature: support get table trigger from oracle (#191)

* feat:support get table trigger from oracle

* fix: trigger diff failed
This commit is contained in:
vran 2022-05-17 17:22:36 +08:00 committed by GitHub
parent 348a6e85dd
commit 5022149094
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 94 additions and 9 deletions

View File

@ -2,10 +2,7 @@ package com.databasir.core.domain.document.converter;
import com.databasir.core.domain.document.data.TableDocumentResponse; import com.databasir.core.domain.document.data.TableDocumentResponse;
import com.databasir.core.infrastructure.converter.JsonConverter; import com.databasir.core.infrastructure.converter.JsonConverter;
import com.databasir.core.meta.data.ColumnMeta; import com.databasir.core.meta.data.*;
import com.databasir.core.meta.data.DatabaseMeta;
import com.databasir.core.meta.data.IndexMeta;
import com.databasir.core.meta.data.TableMeta;
import com.databasir.dao.tables.pojos.*; import com.databasir.dao.tables.pojos.*;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
@ -65,6 +62,9 @@ public interface DatabaseMetaConverter {
@Mapping(target = "columnNames", source = "pojo.columnNameArray") @Mapping(target = "columnNames", source = "pojo.columnNameArray")
IndexMeta of(TableIndexDocumentPojo pojo); IndexMeta of(TableIndexDocumentPojo pojo);
@Mapping(target = "createAt", source = "pojo.triggerCreateAt")
TriggerMeta of(TableTriggerDocumentPojo pojo);
List<TableMeta> of(List<TableDocumentResponse> table); List<TableMeta> of(List<TableDocumentResponse> table);
TableMeta of(TableDocumentResponse table); TableMeta of(TableDocumentResponse table);

View File

@ -3,6 +3,7 @@ package com.databasir.core.meta.provider;
import com.databasir.core.meta.provider.jdbc.*; import com.databasir.core.meta.provider.jdbc.*;
import com.databasir.core.meta.provider.maria.MariaTriggerMetaProvider; import com.databasir.core.meta.provider.maria.MariaTriggerMetaProvider;
import com.databasir.core.meta.provider.mysql.MysqlTableTriggerMetaProvider; import com.databasir.core.meta.provider.mysql.MysqlTableTriggerMetaProvider;
import com.databasir.core.meta.provider.oracle.OracleTriggerMetaProvider;
import com.databasir.core.meta.provider.postgresql.PostgresqlTriggerMetaProvider; import com.databasir.core.meta.provider.postgresql.PostgresqlTriggerMetaProvider;
import com.databasir.core.meta.provider.sqlserver.SqlServerColumnMetaProvider; import com.databasir.core.meta.provider.sqlserver.SqlServerColumnMetaProvider;
import com.databasir.core.meta.provider.sqlserver.SqlServerTableMetaProvider; import com.databasir.core.meta.provider.sqlserver.SqlServerTableMetaProvider;
@ -51,6 +52,9 @@ public class MetaProviders {
if (url.contains(":mariadb:")) { if (url.contains(":mariadb:")) {
return mariaDB(); return mariaDB();
} }
if (url.contains(":oracle:")) {
return oracle();
}
return jdbc(); return jdbc();
} }
@ -109,4 +113,18 @@ public class MetaProviders {
); );
return new JdbcDatabaseMetaProvider(tableMetaProvider); return new JdbcDatabaseMetaProvider(tableMetaProvider);
} }
private static DatabaseMetaProvider oracle() {
var columnMetaProvider = new JdbcColumnMetaProvider();
var foreignKeyMetaProvider = new JdbcForeignKeyMetaProvider();
var indexMetaProvider = new JdbcIndexMetaProvider();
var triggerMetaProvider = new OracleTriggerMetaProvider();
var tableMetaProvider = new JdbcTableMetaProvider(
columnMetaProvider,
indexMetaProvider,
triggerMetaProvider,
foreignKeyMetaProvider
);
return new JdbcDatabaseMetaProvider(tableMetaProvider);
}
} }

View File

@ -35,14 +35,17 @@ public class JdbcIndexMetaProvider implements IndexMetaProvider {
return indexMetas; return indexMetas;
} }
Map<String, IndexMeta> pojoGroupByName = new HashMap<>(); Map<String, IndexMeta> metaGroupByName = new HashMap<>();
try { try {
while (indexResults.next()) { while (indexResults.next()) {
Boolean nonUnique = indexResults.getBoolean("NON_UNIQUE"); Boolean nonUnique = indexResults.getBoolean("NON_UNIQUE");
String indexName = indexResults.getString("INDEX_NAME"); String indexName = indexResults.getString("INDEX_NAME");
String columnName = indexResults.getString("COLUMN_NAME"); String columnName = indexResults.getString("COLUMN_NAME");
if (pojoGroupByName.containsKey(indexName)) { if (indexName == null) {
pojoGroupByName.get(indexName).getColumnNames().add(columnName); continue;
}
if (metaGroupByName.containsKey(indexName)) {
metaGroupByName.get(indexName).getColumnNames().add(columnName);
} else { } else {
List<String> columns = new ArrayList<>(); List<String> columns = new ArrayList<>();
columns.add(columnName); columns.add(columnName);
@ -51,13 +54,13 @@ public class JdbcIndexMetaProvider implements IndexMetaProvider {
.columnNames(columns) .columnNames(columns)
.isUniqueKey(Objects.equals(nonUnique, false)) .isUniqueKey(Objects.equals(nonUnique, false))
.build(); .build();
pojoGroupByName.put(indexName, indexMeta); metaGroupByName.put(indexName, indexMeta);
} }
} }
} finally { } finally {
indexResults.close(); indexResults.close();
} }
return new ArrayList<>(pojoGroupByName.values()); return new ArrayList<>(metaGroupByName.values());
} }
} }

View File

@ -0,0 +1,64 @@
package com.databasir.core.meta.provider.oracle;
import com.databasir.core.meta.data.TriggerMeta;
import com.databasir.core.meta.provider.TriggerMetaProvider;
import com.databasir.core.meta.provider.condition.TableCondition;
import lombok.extern.slf4j.Slf4j;
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.Objects;
@Slf4j
public class OracleTriggerMetaProvider implements TriggerMetaProvider {
@Override
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
String sql = "SELECT trig.table_owner AS schema_name,\n"
+ " trig.table_name,\n"
+ " trig.owner AS trigger_schema_name,\n"
+ " trig.trigger_name,\n"
+ " trig.trigger_type,\n"
+ " trig.triggering_event,\n"
+ " trig.status,\n"
+ " trig.trigger_body AS script\n"
+ "FROM sys.all_triggers trig\n"
+ " INNER JOIN sys.all_tables tab ON trig.table_owner = tab.owner\n"
+ " AND trig.table_name = tab.table_name\n"
+ "WHERE trig.base_object_type = 'TABLE' AND trig.owner = ? AND trig.TABLE_NAME = ?";
try {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setObject(1, condition.getSchemaName());
preparedStatement.setObject(2, condition.getTableName());
ResultSet results = preparedStatement.executeQuery();
List<TriggerMeta> triggers = new ArrayList<>();
while (results.next()) {
String status = results.getString("status");
String name = Objects.requireNonNullElse(results.getString("trigger_name"), "")
+ " ("
+ status
+ ")";
String statement = results.getString("script");
String timing = results.getString("trigger_type");
String manipulation = results.getString("triggering_event");
String created = "unknown";
TriggerMeta meta = TriggerMeta.builder()
.name(name)
.manipulation(manipulation)
.timing(timing)
.statement(statement)
.createAt(created)
.build();
triggers.add(meta);
}
return triggers;
} catch (SQLException e) {
log.warn("get trigger meta failed", e);
return Collections.emptyList();
}
}
}