From ae8dc7ebcc77fe43e4962ce0c60c79c43b40d7bb Mon Sep 17 00:00:00 2001 From: vran Date: Tue, 17 May 2022 15:39:30 +0800 Subject: [PATCH] feat:support get table trigger from oracle --- .../core/meta/provider/MetaProviders.java | 18 ++++++ .../oracle/OracleTriggerMetaProvider.java | 64 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 meta/src/main/java/com/databasir/core/meta/provider/oracle/OracleTriggerMetaProvider.java diff --git a/meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java b/meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java index d50e218..12dabf5 100644 --- a/meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java +++ b/meta/src/main/java/com/databasir/core/meta/provider/MetaProviders.java @@ -3,6 +3,7 @@ package com.databasir.core.meta.provider; import com.databasir.core.meta.provider.jdbc.*; import com.databasir.core.meta.provider.maria.MariaTriggerMetaProvider; 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.sqlserver.SqlServerColumnMetaProvider; import com.databasir.core.meta.provider.sqlserver.SqlServerTableMetaProvider; @@ -51,6 +52,9 @@ public class MetaProviders { if (url.contains(":mariadb:")) { return mariaDB(); } + if (url.contains(":oracle:")) { + return oracle(); + } return jdbc(); } @@ -109,4 +113,18 @@ public class MetaProviders { ); 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); + } } diff --git a/meta/src/main/java/com/databasir/core/meta/provider/oracle/OracleTriggerMetaProvider.java b/meta/src/main/java/com/databasir/core/meta/provider/oracle/OracleTriggerMetaProvider.java new file mode 100644 index 0000000..28c78a9 --- /dev/null +++ b/meta/src/main/java/com/databasir/core/meta/provider/oracle/OracleTriggerMetaProvider.java @@ -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 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 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(); + } + } +}