Skip to content

Commit 5022149

Browse files
authored
feature: support get table trigger from oracle (#191)
* feat:support get table trigger from oracle * fix: trigger diff failed
1 parent 348a6e8 commit 5022149

4 files changed

Lines changed: 94 additions & 9 deletions

File tree

core/src/main/java/com/databasir/core/domain/document/converter/DatabaseMetaConverter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import com.databasir.core.domain.document.data.TableDocumentResponse;
44
import com.databasir.core.infrastructure.converter.JsonConverter;
5-
import com.databasir.core.meta.data.ColumnMeta;
6-
import com.databasir.core.meta.data.DatabaseMeta;
7-
import com.databasir.core.meta.data.IndexMeta;
8-
import com.databasir.core.meta.data.TableMeta;
5+
import com.databasir.core.meta.data.*;
96
import com.databasir.dao.tables.pojos.*;
107
import org.mapstruct.Mapper;
118
import org.mapstruct.Mapping;
@@ -65,6 +62,9 @@ TableMeta of(TableDocumentPojo table,
6562
@Mapping(target = "columnNames", source = "pojo.columnNameArray")
6663
IndexMeta of(TableIndexDocumentPojo pojo);
6764

65+
@Mapping(target = "createAt", source = "pojo.triggerCreateAt")
66+
TriggerMeta of(TableTriggerDocumentPojo pojo);
67+
6868
List<TableMeta> of(List<TableDocumentResponse> table);
6969

7070
TableMeta of(TableDocumentResponse table);

meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.databasir.core.meta.provider.jdbc.*;
44
import com.databasir.core.meta.provider.maria.MariaTriggerMetaProvider;
55
import com.databasir.core.meta.provider.mysql.MysqlTableTriggerMetaProvider;
6+
import com.databasir.core.meta.provider.oracle.OracleTriggerMetaProvider;
67
import com.databasir.core.meta.provider.postgresql.PostgresqlTriggerMetaProvider;
78
import com.databasir.core.meta.provider.sqlserver.SqlServerColumnMetaProvider;
89
import com.databasir.core.meta.provider.sqlserver.SqlServerTableMetaProvider;
@@ -51,6 +52,9 @@ public static DatabaseMetaProvider of(Connection connection) {
5152
if (url.contains(":mariadb:")) {
5253
return mariaDB();
5354
}
55+
if (url.contains(":oracle:")) {
56+
return oracle();
57+
}
5458
return jdbc();
5559
}
5660

@@ -109,4 +113,18 @@ private static DatabaseMetaProvider mariaDB() {
109113
);
110114
return new JdbcDatabaseMetaProvider(tableMetaProvider);
111115
}
116+
117+
private static DatabaseMetaProvider oracle() {
118+
var columnMetaProvider = new JdbcColumnMetaProvider();
119+
var foreignKeyMetaProvider = new JdbcForeignKeyMetaProvider();
120+
var indexMetaProvider = new JdbcIndexMetaProvider();
121+
var triggerMetaProvider = new OracleTriggerMetaProvider();
122+
var tableMetaProvider = new JdbcTableMetaProvider(
123+
columnMetaProvider,
124+
indexMetaProvider,
125+
triggerMetaProvider,
126+
foreignKeyMetaProvider
127+
);
128+
return new JdbcDatabaseMetaProvider(tableMetaProvider);
129+
}
112130
}

meta/src/main/java/com/databasir/core/meta/provider/jdbc/JdbcIndexMetaProvider.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,17 @@ private List<IndexMeta> doCreateIndexDocs(Connection connection, TableCondition
3535
return indexMetas;
3636
}
3737

38-
Map<String, IndexMeta> pojoGroupByName = new HashMap<>();
38+
Map<String, IndexMeta> metaGroupByName = new HashMap<>();
3939
try {
4040
while (indexResults.next()) {
4141
Boolean nonUnique = indexResults.getBoolean("NON_UNIQUE");
4242
String indexName = indexResults.getString("INDEX_NAME");
4343
String columnName = indexResults.getString("COLUMN_NAME");
44-
if (pojoGroupByName.containsKey(indexName)) {
45-
pojoGroupByName.get(indexName).getColumnNames().add(columnName);
44+
if (indexName == null) {
45+
continue;
46+
}
47+
if (metaGroupByName.containsKey(indexName)) {
48+
metaGroupByName.get(indexName).getColumnNames().add(columnName);
4649
} else {
4750
List<String> columns = new ArrayList<>();
4851
columns.add(columnName);
@@ -51,13 +54,13 @@ private List<IndexMeta> doCreateIndexDocs(Connection connection, TableCondition
5154
.columnNames(columns)
5255
.isUniqueKey(Objects.equals(nonUnique, false))
5356
.build();
54-
pojoGroupByName.put(indexName, indexMeta);
57+
metaGroupByName.put(indexName, indexMeta);
5558
}
5659
}
5760
} finally {
5861
indexResults.close();
5962
}
60-
return new ArrayList<>(pojoGroupByName.values());
63+
return new ArrayList<>(metaGroupByName.values());
6164
}
6265

6366
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.databasir.core.meta.provider.oracle;
2+
3+
import com.databasir.core.meta.data.TriggerMeta;
4+
import com.databasir.core.meta.provider.TriggerMetaProvider;
5+
import com.databasir.core.meta.provider.condition.TableCondition;
6+
import lombok.extern.slf4j.Slf4j;
7+
8+
import java.sql.Connection;
9+
import java.sql.PreparedStatement;
10+
import java.sql.ResultSet;
11+
import java.sql.SQLException;
12+
import java.util.ArrayList;
13+
import java.util.Collections;
14+
import java.util.List;
15+
import java.util.Objects;
16+
17+
@Slf4j
18+
public class OracleTriggerMetaProvider implements TriggerMetaProvider {
19+
@Override
20+
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
21+
String sql = "SELECT trig.table_owner AS schema_name,\n"
22+
+ " trig.table_name,\n"
23+
+ " trig.owner AS trigger_schema_name,\n"
24+
+ " trig.trigger_name,\n"
25+
+ " trig.trigger_type,\n"
26+
+ " trig.triggering_event,\n"
27+
+ " trig.status,\n"
28+
+ " trig.trigger_body AS script\n"
29+
+ "FROM sys.all_triggers trig\n"
30+
+ " INNER JOIN sys.all_tables tab ON trig.table_owner = tab.owner\n"
31+
+ " AND trig.table_name = tab.table_name\n"
32+
+ "WHERE trig.base_object_type = 'TABLE' AND trig.owner = ? AND trig.TABLE_NAME = ?";
33+
try {
34+
PreparedStatement preparedStatement = connection.prepareStatement(sql);
35+
preparedStatement.setObject(1, condition.getSchemaName());
36+
preparedStatement.setObject(2, condition.getTableName());
37+
ResultSet results = preparedStatement.executeQuery();
38+
List<TriggerMeta> triggers = new ArrayList<>();
39+
while (results.next()) {
40+
String status = results.getString("status");
41+
String name = Objects.requireNonNullElse(results.getString("trigger_name"), "")
42+
+ " ("
43+
+ status
44+
+ ")";
45+
String statement = results.getString("script");
46+
String timing = results.getString("trigger_type");
47+
String manipulation = results.getString("triggering_event");
48+
String created = "unknown";
49+
TriggerMeta meta = TriggerMeta.builder()
50+
.name(name)
51+
.manipulation(manipulation)
52+
.timing(timing)
53+
.statement(statement)
54+
.createAt(created)
55+
.build();
56+
triggers.add(meta);
57+
}
58+
return triggers;
59+
} catch (SQLException e) {
60+
log.warn("get trigger meta failed", e);
61+
return Collections.emptyList();
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)