feat: optimize trigger provider design
This commit is contained in:
parent
5022149094
commit
92bf101da9
|
@ -0,0 +1,82 @@
|
||||||
|
package com.databasir.core.meta.provider;
|
||||||
|
|
||||||
|
import com.databasir.core.meta.data.TriggerMeta;
|
||||||
|
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 abstract class AbstractSqlTriggerMetaProvider implements TriggerMetaProvider {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
||||||
|
String sql = sql(condition);
|
||||||
|
PreparedStatement preparedStatement = null;
|
||||||
|
try {
|
||||||
|
preparedStatement = connection.prepareStatement(sql);
|
||||||
|
ResultSet results = preparedStatement.executeQuery();
|
||||||
|
List<TriggerMeta> triggers = new ArrayList<>();
|
||||||
|
while (results.next()) {
|
||||||
|
String name = getTriggerName(results);
|
||||||
|
String statement = getStatement(results);
|
||||||
|
String timing = getTiming(results);
|
||||||
|
String manipulation = getManipulation(results);
|
||||||
|
String created = getCreateAt(results);
|
||||||
|
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();
|
||||||
|
} finally {
|
||||||
|
if (preparedStatement != null) {
|
||||||
|
try {
|
||||||
|
preparedStatement.close();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract String sql(TableCondition condition);
|
||||||
|
|
||||||
|
protected String getTriggerName(ResultSet results) throws SQLException {
|
||||||
|
return Objects.requireNonNullElse(results.getString("TRIGGER_NAME"), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getStatement(ResultSet results) throws SQLException {
|
||||||
|
return results.getString("ACTION_STATEMENT");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getTiming(ResultSet results) throws SQLException {
|
||||||
|
return results.getString("ACTION_TIMING");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getManipulation(ResultSet results) throws SQLException {
|
||||||
|
return results.getString("EVENT_MANIPULATION");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getCreateAt(ResultSet results) throws SQLException {
|
||||||
|
String created = results.getString("CREATED");
|
||||||
|
if (created == null) {
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
return created;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,75 +0,0 @@
|
||||||
package com.databasir.core.meta.provider;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO use to extension repository
|
|
||||||
*/
|
|
||||||
public interface SqlProvider {
|
|
||||||
|
|
||||||
Default DEFAULT = new Default();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <p>
|
|
||||||
* generate sql to select database information, should return the follow columns
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <table>
|
|
||||||
* <tr>
|
|
||||||
* <th> column name </th>
|
|
||||||
* <th> column type </th>
|
|
||||||
* <th> description </th>
|
|
||||||
* <th> nullable </th>
|
|
||||||
* </tr>
|
|
||||||
* <tr>
|
|
||||||
* <td> TABLE_CAT </td>
|
|
||||||
* <td> String </td>
|
|
||||||
* <td> catalog name </td>
|
|
||||||
* <td> NO </td>
|
|
||||||
* </tr>
|
|
||||||
* </table>
|
|
||||||
* <br>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
default Optional<String> databaseMetaSql(String databaseName) {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* generate sql to select table information, should return the follow columns
|
|
||||||
* <table>
|
|
||||||
* <tr>
|
|
||||||
* <th> column name </th>
|
|
||||||
* <th> column type </th>
|
|
||||||
* <th> description </th>
|
|
||||||
* <th> nullable </th>
|
|
||||||
* </tr>
|
|
||||||
* <tr>
|
|
||||||
* <td> TABLE_CAT </td>
|
|
||||||
* <td> String </td>
|
|
||||||
* <td> catalog name </td>
|
|
||||||
* <td> NO </td>
|
|
||||||
* </tr>
|
|
||||||
* </table>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
default Optional<String> tableMetaSql(String databaseName, String tableName) {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
default Optional<String> tableColumnMetaSql(String databaseName, String tableName) {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
default Optional<String> tableIndexMetaSql(String databaseName, String tableName) {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
default Optional<String> tableTriggerMetaSql(String databaseName, String tableName) {
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
class Default implements SqlProvider {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,23 +1,13 @@
|
||||||
package com.databasir.core.meta.provider.maria;
|
package com.databasir.core.meta.provider.maria;
|
||||||
|
|
||||||
import com.databasir.core.meta.data.TriggerMeta;
|
import com.databasir.core.meta.provider.AbstractSqlTriggerMetaProvider;
|
||||||
import com.databasir.core.meta.provider.TriggerMetaProvider;
|
|
||||||
import com.databasir.core.meta.provider.condition.TableCondition;
|
import com.databasir.core.meta.provider.condition.TableCondition;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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
|
@Slf4j
|
||||||
public class MariaTriggerMetaProvider implements TriggerMetaProvider {
|
public class MariaTriggerMetaProvider extends AbstractSqlTriggerMetaProvider {
|
||||||
@Override
|
@Override
|
||||||
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
protected String sql(TableCondition condition) {
|
||||||
String sql = "SELECT \n"
|
String sql = "SELECT \n"
|
||||||
+ " TRIGGER_NAME,\n"
|
+ " TRIGGER_NAME,\n"
|
||||||
+ " TRIGGER_SCHEMA,\n"
|
+ " TRIGGER_SCHEMA,\n"
|
||||||
|
@ -30,36 +20,7 @@ public class MariaTriggerMetaProvider implements TriggerMetaProvider {
|
||||||
+ " EVENT_MANIPULATION,\n"
|
+ " EVENT_MANIPULATION,\n"
|
||||||
+ " CREATED\n"
|
+ " CREATED\n"
|
||||||
+ "FROM information_schema.triggers "
|
+ "FROM information_schema.triggers "
|
||||||
+ "WHERE TRIGGER_SCHEMA = ? AND EVENT_OBJECT_TABLE = ?";
|
+ "WHERE TRIGGER_SCHEMA = '%s' AND EVENT_OBJECT_TABLE = '%s'";
|
||||||
try {
|
return String.format(sql, condition.getDatabaseName(), condition.getTableName());
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement(sql);
|
|
||||||
// TODO : mariaDB's default database is 'def', the schema is equal to the user's input db name
|
|
||||||
preparedStatement.setObject(1, condition.getDatabaseName());
|
|
||||||
preparedStatement.setObject(2, condition.getTableName());
|
|
||||||
ResultSet results = preparedStatement.executeQuery();
|
|
||||||
List<TriggerMeta> triggers = new ArrayList<>();
|
|
||||||
while (results.next()) {
|
|
||||||
String name = Objects.requireNonNullElse(results.getString("TRIGGER_NAME"), "");
|
|
||||||
String statement = results.getString("ACTION_STATEMENT");
|
|
||||||
String timing = results.getString("ACTION_TIMING");
|
|
||||||
String manipulation = results.getString("EVENT_MANIPULATION");
|
|
||||||
String created = results.getString("CREATED");
|
|
||||||
if (created == null) {
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +1,13 @@
|
||||||
package com.databasir.core.meta.provider.mysql;
|
package com.databasir.core.meta.provider.mysql;
|
||||||
|
|
||||||
import com.databasir.core.meta.data.TriggerMeta;
|
import com.databasir.core.meta.provider.AbstractSqlTriggerMetaProvider;
|
||||||
import com.databasir.core.meta.provider.TriggerMetaProvider;
|
|
||||||
import com.databasir.core.meta.provider.condition.TableCondition;
|
import com.databasir.core.meta.provider.condition.TableCondition;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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
|
@Slf4j
|
||||||
public class MysqlTableTriggerMetaProvider implements TriggerMetaProvider {
|
public class MysqlTableTriggerMetaProvider extends AbstractSqlTriggerMetaProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
protected String sql(TableCondition condition) {
|
||||||
String sql = "SELECT TRIGGER_CATALOG,\n"
|
String sql = "SELECT TRIGGER_CATALOG,\n"
|
||||||
+ " TRIGGER_SCHEMA,\n"
|
+ " TRIGGER_SCHEMA,\n"
|
||||||
+ " TRIGGER_NAME,\n"
|
+ " TRIGGER_NAME,\n"
|
||||||
|
@ -38,36 +27,8 @@ public class MysqlTableTriggerMetaProvider implements TriggerMetaProvider {
|
||||||
+ " CREATED,\n"
|
+ " CREATED,\n"
|
||||||
+ " SQL_MODE,\n"
|
+ " SQL_MODE,\n"
|
||||||
+ " DEFINER\n "
|
+ " DEFINER\n "
|
||||||
+ "FROM information_schema.TRIGGERS WHERE EVENT_OBJECT_SCHEMA = ? AND EVENT_OBJECT_TABLE = ?";
|
+ "FROM information_schema.TRIGGERS WHERE EVENT_OBJECT_SCHEMA = '%s' AND EVENT_OBJECT_TABLE = '%s'";
|
||||||
try {
|
return String.format(sql, condition.getDatabaseName(), condition.getTableName());
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement(sql);
|
|
||||||
preparedStatement.setObject(1, condition.getDatabaseName());
|
|
||||||
preparedStatement.setObject(2, condition.getTableName());
|
|
||||||
ResultSet results = preparedStatement.executeQuery();
|
|
||||||
List<TriggerMeta> triggers = new ArrayList<>();
|
|
||||||
while (results.next()) {
|
|
||||||
String name = Objects.requireNonNullElse(results.getString("TRIGGER_NAME"), "");
|
|
||||||
String statement = results.getString("ACTION_STATEMENT");
|
|
||||||
String timing = results.getString("ACTION_TIMING");
|
|
||||||
String manipulation = results.getString("EVENT_MANIPULATION");
|
|
||||||
String created = results.getString("CREATED");
|
|
||||||
if (created == null) {
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,64 +1,44 @@
|
||||||
package com.databasir.core.meta.provider.oracle;
|
package com.databasir.core.meta.provider.oracle;
|
||||||
|
|
||||||
import com.databasir.core.meta.data.TriggerMeta;
|
import com.databasir.core.meta.provider.AbstractSqlTriggerMetaProvider;
|
||||||
import com.databasir.core.meta.provider.TriggerMetaProvider;
|
|
||||||
import com.databasir.core.meta.provider.condition.TableCondition;
|
import com.databasir.core.meta.provider.condition.TableCondition;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class OracleTriggerMetaProvider implements TriggerMetaProvider {
|
public class OracleTriggerMetaProvider extends AbstractSqlTriggerMetaProvider {
|
||||||
@Override
|
@Override
|
||||||
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
protected String sql(TableCondition condition) {
|
||||||
String sql = "SELECT trig.table_owner AS schema_name,\n"
|
String sql = "SELECT trig.table_owner AS schema_name,\n"
|
||||||
+ " trig.table_name,\n"
|
+ " trig.table_name,\n"
|
||||||
+ " trig.owner AS trigger_schema_name,\n"
|
+ " trig.owner AS trigger_schema_name,\n"
|
||||||
+ " trig.trigger_name,\n"
|
+ " trig.trigger_name as TRIGGER_NAME,\n"
|
||||||
+ " trig.trigger_type,\n"
|
+ " trig.trigger_type AS ACTION_TIMING,\n"
|
||||||
+ " trig.triggering_event,\n"
|
+ " trig.triggering_event as EVENT_MANIPULATION,\n"
|
||||||
+ " trig.status,\n"
|
+ " trig.status,\n"
|
||||||
+ " trig.trigger_body AS script\n"
|
+ " trig.trigger_body AS ACTION_STATEMENT \n"
|
||||||
+ "FROM sys.all_triggers trig\n"
|
+ "FROM sys.all_triggers trig\n"
|
||||||
+ " INNER JOIN sys.all_tables tab ON trig.table_owner = tab.owner\n"
|
+ " INNER JOIN sys.all_tables tab ON trig.table_owner = tab.owner\n"
|
||||||
+ " AND trig.table_name = tab.table_name\n"
|
+ " AND trig.table_name = tab.table_name\n"
|
||||||
+ "WHERE trig.base_object_type = 'TABLE' AND trig.owner = ? AND trig.TABLE_NAME = ?";
|
+ "WHERE trig.base_object_type = 'TABLE' AND trig.owner = '%s' AND trig.TABLE_NAME = '%s'";
|
||||||
try {
|
return String.format(sql, condition.getSchemaName(), condition.getTableName());
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement(sql);
|
}
|
||||||
preparedStatement.setObject(1, condition.getSchemaName());
|
|
||||||
preparedStatement.setObject(2, condition.getTableName());
|
@Override
|
||||||
ResultSet results = preparedStatement.executeQuery();
|
protected String getTriggerName(ResultSet results) throws SQLException {
|
||||||
List<TriggerMeta> triggers = new ArrayList<>();
|
String status = results.getString("status");
|
||||||
while (results.next()) {
|
String name = Objects.requireNonNullElse(results.getString("trigger_name"), "")
|
||||||
String status = results.getString("status");
|
+ " ("
|
||||||
String name = Objects.requireNonNullElse(results.getString("trigger_name"), "")
|
+ status
|
||||||
+ " ("
|
+ ")";
|
||||||
+ status
|
return name;
|
||||||
+ ")";
|
}
|
||||||
String statement = results.getString("script");
|
|
||||||
String timing = results.getString("trigger_type");
|
@Override
|
||||||
String manipulation = results.getString("triggering_event");
|
protected String getCreateAt(ResultSet results) throws SQLException {
|
||||||
String created = "unknown";
|
return "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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,65 +1,25 @@
|
||||||
package com.databasir.core.meta.provider.postgresql;
|
package com.databasir.core.meta.provider.postgresql;
|
||||||
|
|
||||||
import com.databasir.core.meta.data.TriggerMeta;
|
import com.databasir.core.meta.provider.AbstractSqlTriggerMetaProvider;
|
||||||
import com.databasir.core.meta.provider.TriggerMetaProvider;
|
|
||||||
import com.databasir.core.meta.provider.condition.TableCondition;
|
import com.databasir.core.meta.provider.condition.TableCondition;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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
|
@Slf4j
|
||||||
public class PostgresqlTriggerMetaProvider implements TriggerMetaProvider {
|
public class PostgresqlTriggerMetaProvider extends AbstractSqlTriggerMetaProvider {
|
||||||
@Override
|
@Override
|
||||||
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
protected String sql(TableCondition condition) {
|
||||||
String sql = "SELECT trigger_name AS name,\n"
|
String sql = "SELECT trigger_name AS TRIGGER_NAME,\n"
|
||||||
+ " action_timing AS timing,\n"
|
+ " action_timing AS ACTION_TIMING,\n"
|
||||||
+ " event_manipulation AS manipulation,\n"
|
+ " event_manipulation AS EVENT_MANIPULATION,\n"
|
||||||
+ " action_statement AS statement,\n"
|
+ " action_statement AS ACTION_STATEMENT,\n"
|
||||||
+ " created AS trigger_create_at,\n"
|
+ " created AS CREATED,\n"
|
||||||
+ " trigger_catalog AS trigger_catalog,\n"
|
+ " trigger_catalog AS trigger_catalog,\n"
|
||||||
+ " TRIGGER_SCHEMA AS trigger_schema,\n"
|
+ " TRIGGER_SCHEMA AS trigger_schema,\n"
|
||||||
+ " event_object_catalog AS target_catalog,\n"
|
+ " event_object_catalog AS target_catalog,\n"
|
||||||
+ " event_object_schema AS target_schema,\n"
|
+ " event_object_schema AS target_schema,\n"
|
||||||
+ " event_object_table AS target_table_name\n"
|
+ " event_object_table AS target_table_name\n"
|
||||||
+ "FROM information_schema.triggers "
|
+ "FROM information_schema.triggers "
|
||||||
+ "WHERE trigger_catalog = ? AND trigger_schema = ? AND event_object_table = ?;";
|
+ "WHERE trigger_catalog = '%s' AND trigger_schema = '%s' AND event_object_table = '%s';";
|
||||||
try {
|
return String.format(sql, condition.getDatabaseName(), condition.getSchemaName(), condition.getTableName());
|
||||||
PreparedStatement preparedStatement = connection.prepareStatement(sql);
|
|
||||||
preparedStatement.setObject(1, condition.getDatabaseName());
|
|
||||||
preparedStatement.setObject(2, condition.getSchemaName());
|
|
||||||
preparedStatement.setObject(3, condition.getTableName());
|
|
||||||
ResultSet results = preparedStatement.executeQuery();
|
|
||||||
List<TriggerMeta> triggers = new ArrayList<>();
|
|
||||||
while (results.next()) {
|
|
||||||
String name = Objects.requireNonNullElse(results.getString("name"), "");
|
|
||||||
String statement = results.getString("statement");
|
|
||||||
String timing = results.getString("timing");
|
|
||||||
String manipulation = results.getString("manipulation");
|
|
||||||
// postgresql default is null
|
|
||||||
String created = results.getString("trigger_create_at");
|
|
||||||
if (created == null) {
|
|
||||||
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("postgresql get trigger meta failed", e);
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,29 +1,19 @@
|
||||||
package com.databasir.core.meta.provider.sqlserver;
|
package com.databasir.core.meta.provider.sqlserver;
|
||||||
|
|
||||||
import com.databasir.core.meta.data.TriggerMeta;
|
import com.databasir.core.meta.provider.AbstractSqlTriggerMetaProvider;
|
||||||
import com.databasir.core.meta.provider.TriggerMetaProvider;
|
|
||||||
import com.databasir.core.meta.provider.condition.TableCondition;
|
import com.databasir.core.meta.provider.condition.TableCondition;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class SqlServerTriggerMetaProvider implements TriggerMetaProvider {
|
public class SqlServerTriggerMetaProvider extends AbstractSqlTriggerMetaProvider {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<TriggerMeta> selectTriggers(Connection connection, TableCondition condition) {
|
protected String sql(TableCondition condition) {
|
||||||
String sql = "SELECT SCHEMA_NAME(tab.schema_id) + '.' + tab.name AS table_name,\n"
|
String sql = "SELECT SCHEMA_NAME(tab.schema_id) + '.' + tab.name AS table_name,\n"
|
||||||
+ " trig.name AS trigger_name,\n"
|
+ " trig.name AS TRIGGER_NAME,\n"
|
||||||
+ " trig.create_date AS create_date,\n"
|
+ " trig.create_date AS CREATED,\n"
|
||||||
+ " CASE\n"
|
+ " CASE\n"
|
||||||
+ " WHEN is_instead_of_trigger = 1 THEN 'Instead of'\n"
|
+ " WHEN is_instead_of_trigger = 1 THEN 'Instead of'\n"
|
||||||
+ " ELSE 'After' END AS timing,\n"
|
+ " ELSE 'After' END AS ACTION_TIMING,\n"
|
||||||
+ " (CASE\n"
|
+ " (CASE\n"
|
||||||
+ " WHEN OBJECTPROPERTY(trig.object_id, 'ExecIsUpdateTrigger') = 1\n"
|
+ " WHEN OBJECTPROPERTY(trig.object_id, 'ExecIsUpdateTrigger') = 1\n"
|
||||||
+ " THEN 'Update '\n"
|
+ " THEN 'Update '\n"
|
||||||
|
@ -36,7 +26,7 @@ public class SqlServerTriggerMetaProvider implements TriggerMetaProvider {
|
||||||
+ " WHEN OBJECTPROPERTY(trig.object_id, 'ExecIsInsertTrigger') = 1\n"
|
+ " WHEN OBJECTPROPERTY(trig.object_id, 'ExecIsInsertTrigger') = 1\n"
|
||||||
+ " THEN 'Insert '\n"
|
+ " THEN 'Insert '\n"
|
||||||
+ " ELSE '' END\n"
|
+ " ELSE '' END\n"
|
||||||
+ " ) AS manipulation,\n"
|
+ " ) AS EVENT_MANIPULATION,\n"
|
||||||
+ " CASE\n"
|
+ " CASE\n"
|
||||||
+ " WHEN trig.[type] = 'TA' THEN 'Assembly (CLR) trigger'\n"
|
+ " WHEN trig.[type] = 'TA' THEN 'Assembly (CLR) trigger'\n"
|
||||||
+ " WHEN trig.[type] = 'TR' THEN 'SQL trigger'\n"
|
+ " WHEN trig.[type] = 'TR' THEN 'SQL trigger'\n"
|
||||||
|
@ -44,50 +34,12 @@ public class SqlServerTriggerMetaProvider implements TriggerMetaProvider {
|
||||||
+ " CASE\n"
|
+ " CASE\n"
|
||||||
+ " WHEN is_disabled = 1 THEN 'Disabled'\n"
|
+ " WHEN is_disabled = 1 THEN 'Disabled'\n"
|
||||||
+ " ELSE 'Active' END AS [status],\n"
|
+ " ELSE 'Active' END AS [status],\n"
|
||||||
+ " OBJECT_DEFINITION(trig.object_id) AS STATEMENT\n"
|
+ " OBJECT_DEFINITION(trig.object_id) AS ACTION_STATEMENT\n"
|
||||||
+ "FROM sys.triggers trig\n"
|
+ "FROM sys.triggers trig\n"
|
||||||
+ " INNER JOIN sys.objects tab\n"
|
+ " INNER JOIN sys.objects tab\n"
|
||||||
+ " ON trig.parent_id = tab.object_id\n"
|
+ " ON trig.parent_id = tab.object_id\n"
|
||||||
+ "WHERE SCHEMA_NAME(tab.schema_id) = ? AND tab.name = ?";
|
+ "WHERE SCHEMA_NAME(tab.schema_id) = '%s' AND tab.name = '%s'";
|
||||||
PreparedStatement preparedStatement = null;
|
return String.format(sql, condition.getSchemaName(), condition.getTableName());
|
||||||
List<TriggerMeta> triggerMetas = new ArrayList<>();
|
|
||||||
try {
|
|
||||||
preparedStatement = connection.prepareStatement(sql);
|
|
||||||
preparedStatement.setString(1, condition.getSchemaName());
|
|
||||||
preparedStatement.setString(2, condition.getTableName());
|
|
||||||
ResultSet resultSet = preparedStatement.executeQuery();
|
|
||||||
while (resultSet.next()) {
|
|
||||||
String triggerName = Objects.requireNonNullElse(resultSet.getString("trigger_name"), "");
|
|
||||||
String timing = resultSet.getString("timing");
|
|
||||||
String manipulation = resultSet.getString("manipulation");
|
|
||||||
String statement = resultSet.getString("statement");
|
|
||||||
String createAt = resultSet.getString("create_date");
|
|
||||||
if (createAt == null) {
|
|
||||||
createAt = "unknown";
|
|
||||||
}
|
|
||||||
triggerMetas.add(TriggerMeta.builder()
|
|
||||||
.name(triggerName)
|
|
||||||
.timing(timing)
|
|
||||||
.manipulation(manipulation)
|
|
||||||
.statement(statement)
|
|
||||||
.createAt(createAt)
|
|
||||||
.build());
|
|
||||||
}
|
|
||||||
} catch (SQLException e) {
|
|
||||||
log.warn("ignore trigger meta by error {}", e.getMessage());
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("ignore trigger meta by error ", e);
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
if (preparedStatement != null) {
|
|
||||||
try {
|
|
||||||
preparedStatement.close();
|
|
||||||
} catch (SQLException e) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return triggerMetas;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue