提交 67fe8ca1 编写于 作者: S serge-rider

#2646 Global triggers for Generic driver (SQL Server)

上级 f5577950
......@@ -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
......
......@@ -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
......
......@@ -98,6 +98,9 @@
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTrigger" label="%tree.triggers.node.name" icon="#triggers" description="Global triggers" visibleIf="object.dataSource.metaModel.supportsDatabaseTriggers(object.dataSource)">
<items label="%tree.trigger.node.name" path="trigger" property="triggers" icon="#trigger"/>
</folder>
<folder type="org.jkiss.dbeaver.ext.generic.model.GenericTrigger" label="%tree.tableTriggers.node.name" icon="#triggers" description="All table triggers" visibleIf="object.dataSource.metaModel.supportsTriggers(object.dataSource)">
<items label="%tree.trigger.node.name" path="trigger" property="tableTriggers" icon="#trigger"/>
</folder>
<folder type="org.jkiss.dbeaver.model.struct.DBSDataType" label="%tree.dataTypes.node.name" icon="#data_types" description="Global data types">
<items label="%tree.dataType.node.name" path="dataType" property="dataTypes" icon="#data_type"/>
</folder>
......
......@@ -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
......
......@@ -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<GenericTrigger> 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;
}
}
......@@ -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;
......
......@@ -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<GenericTrigger> result = new ArrayList<>();
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册