feature: support get table trigger from oracle (#191)
* feat:support get table trigger from oracle * fix: trigger diff failed
This commit is contained in:
parent
348a6e85dd
commit
5022149094
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue