diff --git a/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/OSGI-INF/l10n/bundle_ru.properties b/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/OSGI-INF/l10n/bundle_ru.properties
index 9dbf4986b2438d328d78982d9cdc70b98b8d7fdb..798d2b8168b21e9bc7bca8066cb2da0bdbb85f67 100644
--- a/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/OSGI-INF/l10n/bundle_ru.properties
+++ b/nls/bundles/org.jkiss.dbeaver.ext.generic.nls/OSGI-INF/l10n/bundle_ru.properties
@@ -23,6 +23,10 @@ tree.reference.node.name=\u0421\u0441\u044B\u043B\u043A\u0430
tree.reference_columns.node.name=\u041A\u043E\u043B\u043E\u043D\u043A\u0438 \u0441\u0441\u044B\u043B\u043A\u0438
tree.sub_table.node.name=\u041F\u043E\u0434\u0442\u0430\u0431\u043B\u0438\u0446\u0430
tree.procedure_columns.node.name=\u041A\u043E\u043B\u043E\u043D\u043A\u0438 \u043F\u0440\u043E\u0446\u0435\u0434\u0443\u0440\u044B
+tree.triggers.node.name=\u0422\u0440\u0438\u0433\u0433\u0435\u0440\u044B
+tree.trigger.node.name=\u0422\u0440\u0438\u0433\u0433\u0435\u0440
+tree.tableTriggers.node.name=\u0422\u0440\u0438\u0433\u0433\u0435\u0440\u044B \u0442\u0430\u0431\u043B\u0438\u0446
+
meta.org.jkiss.dbeaver.ext.generic.model.GenericTable.tableType.name=\u0422\u0438\u043F \u0422\u0430\u0431\u043B\u0438\u0446\u044B
meta.org.jkiss.dbeaver.ext.generic.model.GenericTable.catalog.name=\u041A\u0430\u0442\u0430\u043B\u043E\u0433
meta.org.jkiss.dbeaver.ext.generic.model.GenericCatalog.name.name=\u0418\u043C\u044F \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430
diff --git a/plugins/org.jkiss.dbeaver.ext.generic/OSGI-INF/l10n/bundle.properties b/plugins/org.jkiss.dbeaver.ext.generic/OSGI-INF/l10n/bundle.properties
index b1bb08b46d861595d0645575ef0a5599521a6707..ed99e05d8aed68cea84777411f6eb5b50a992b8d 100644
--- a/plugins/org.jkiss.dbeaver.ext.generic/OSGI-INF/l10n/bundle.properties
+++ b/plugins/org.jkiss.dbeaver.ext.generic/OSGI-INF/l10n/bundle.properties
@@ -29,6 +29,7 @@ tree.sequences.node.name=Sequences
tree.sequence.node.name=Sequence
tree.triggers.node.name=Triggers
tree.trigger.node.name=Trigger
+tree.tableTriggers.node.name=Table Triggers
tree.dataTypes.node.name=Data Types
tree.dataType.node.name=Data Type
diff --git a/plugins/org.jkiss.dbeaver.ext.generic/plugin.xml b/plugins/org.jkiss.dbeaver.ext.generic/plugin.xml
index 4086e3a6d3b442751556850f23a5dbaf09080774..31e88ca965dfa8c8db0218463ea2add16418fb8b 100644
--- a/plugins/org.jkiss.dbeaver.ext.generic/plugin.xml
+++ b/plugins/org.jkiss.dbeaver.ext.generic/plugin.xml
@@ -98,6 +98,9 @@
+
+
+
diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericDataSource.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericDataSource.java
index 988889d75e6e1dea8e2c1b566dba7c54425bea6d..f2f5435d3263a39096225a3e3e5b9ec49433ab90 100644
--- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericDataSource.java
+++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericDataSource.java
@@ -383,6 +383,11 @@ public class GenericDataSource extends JDBCDataSource
return structureContainer == null ? null : structureContainer.getTriggers(monitor);
}
+ @Override
+ public Collection extends GenericTrigger> getTableTriggers(DBRProgressMonitor monitor) throws DBException {
+ return structureContainer == null ? null : structureContainer.getTableTriggers(monitor);
+ }
+
@Override
public void initialize(@NotNull DBRProgressMonitor monitor)
throws DBException
diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericObjectContainer.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericObjectContainer.java
index 0ce3fe73cc245ad9141f596bf0bf5c74a37860e3..1b60a1fd37ac6ceb9de785a76c14bf6169fa7861 100644
--- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericObjectContainer.java
+++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericObjectContainer.java
@@ -312,11 +312,23 @@ public abstract class GenericObjectContainer implements GenericStructContainer,D
@Override
public Collection extends GenericTrigger> getTriggers(DBRProgressMonitor monitor) throws DBException {
if (triggers == null) {
- loadTriggers(monitor);
+ triggers = loadTriggers(monitor);
}
return triggers;
}
+ @Override
+ public Collection extends GenericTrigger> getTableTriggers(DBRProgressMonitor monitor) throws DBException {
+ List tableTriggers = new ArrayList<>();
+ for (GenericTable table : getTables(monitor)) {
+ Collection extends GenericTrigger> tt = table.getTriggers(monitor);
+ if (!CommonUtils.isEmpty(tt)) {
+ tableTriggers.addAll(tt);
+ }
+ }
+ return tableTriggers;
+ }
+
@Association
public Collection extends DBSDataType> getDataTypes(DBRProgressMonitor monitor) throws DBException {
return getDataSource().getDataTypes(monitor);
@@ -409,17 +421,18 @@ public abstract class GenericObjectContainer implements GenericStructContainer,D
}
}
- private synchronized void loadTriggers(DBRProgressMonitor monitor)
+ private synchronized List extends GenericTrigger> loadTriggers(DBRProgressMonitor monitor)
throws DBException
{
- triggers = dataSource.getMetaModel().loadTriggers(monitor, this, null);
+ List extends GenericTrigger> triggers = dataSource.getMetaModel().loadTriggers(monitor, this, null);
// Order procedures
- if (triggers == null) {
- triggers = new ArrayList<>();
+ if (this.triggers == null) {
+ this.triggers = new ArrayList<>();
} else {
- DBUtils.orderObjects(triggers);
+ DBUtils.orderObjects(this.triggers);
}
+ return triggers;
}
}
diff --git a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericStructContainer.java b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericStructContainer.java
index cb9d1d3baf6825a8f2824a94c4b9e6f7b34e6b61..aabcf62a5e73ad9e70c1c8f2f4f1c453be533592 100644
--- a/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericStructContainer.java
+++ b/plugins/org.jkiss.dbeaver.ext.generic/src/org/jkiss/dbeaver/ext/generic/model/GenericStructContainer.java
@@ -72,6 +72,8 @@ public interface GenericStructContainer extends DBSObjectContainer, DBSProcedure
Collection extends GenericTrigger> getTriggers(DBRProgressMonitor monitor) throws DBException;
+ Collection extends GenericTrigger> getTableTriggers(DBRProgressMonitor monitor) throws DBException;
+
Collection extends DBSDataType> getDataTypes(DBRProgressMonitor monitor) throws DBException;
diff --git a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerMetaModel.java b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerMetaModel.java
index efa808a0ce7b0fa86b8c02c6299e24d5e7352ff0..c919e46af21415e2714b39affb3e37b1d570929c 100644
--- a/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerMetaModel.java
+++ b/plugins/org.jkiss.dbeaver.ext.mssql/src/org/jkiss/dbeaver/ext/mssql/model/SQLServerMetaModel.java
@@ -75,19 +75,25 @@ public class SQLServerMetaModel extends GenericMetaModel implements DBCQueryTran
@Override
public List extends GenericTrigger> loadTriggers(DBRProgressMonitor monitor, @NotNull GenericStructContainer container, @Nullable GenericTable table) throws DBException {
- assert table != null;
try (JDBCSession session = DBUtils.openMetaSession(monitor, container.getDataSource(), "Read triggers")) {
String schema = getSystemSchema(getServerType(container.getDataSource()));
- String catalog = DBUtils.getQuotedIdentifier(table.getCatalog());
- String query =
- "SELECT triggers.name FROM " + catalog + "." + schema + ".sysobjects tables, " + catalog + "." + schema + ".sysobjects triggers\n" +
- "WHERE triggers.type = 'TR'\n" +
- "AND triggers.deltrig = tables.id\n" +
- "AND user_name(tables.uid) = ? AND tables.name = ?";
-
- try (JDBCPreparedStatement dbStat = session.prepareStatement(query)) {
- dbStat.setString(1, table.getSchema().getName());
- dbStat.setString(2, table.getName());
+ String catalog = DBUtils.getQuotedIdentifier(container.getCatalog());
+ StringBuilder query = new StringBuilder("SELECT triggers.name FROM " + catalog + "." + schema + ".sysobjects triggers");
+ if (table != null) {
+ query.append(",").append(catalog).append(".").append(schema).append(".sysobjects tables");
+ }
+ query.append("\nWHERE triggers.type = 'TR'\n");
+ if (table != null) {
+ query.append(
+ "AND triggers.deltrig = tables.id\n" +
+ "AND user_name(tables.uid) = ? AND tables.name = ?");
+ }
+
+ try (JDBCPreparedStatement dbStat = session.prepareStatement(query.toString())) {
+ if (table != null) {
+ dbStat.setString(1, table.getSchema().getName());
+ dbStat.setString(2, table.getName());
+ }
List result = new ArrayList<>();
try (JDBCResultSet dbResult = dbStat.executeQuery()) {