diff --git a/api/src/controllers/tables.js b/api/src/controllers/tables.js index 69163588f..5581ea258 100644 --- a/api/src/controllers/tables.js +++ b/api/src/controllers/tables.js @@ -13,6 +13,10 @@ module.exports = { async tableInfo({ conid, database, schemaName, pureName }) { const opened = await databaseConnections.ensureOpened(conid, database); const table = opened.structure.tables.find(x => x.pureName == pureName && x.schemaName == schemaName); - return table; + const allForeignKeys = _.flatten(opened.structure.tables.map(x => x.foreignKeys)); + return { + ...table, + dependencies: allForeignKeys.filter(x => x.refSchemaName == schemaName && x.refTableName == pureName), + }; }, }; diff --git a/api/src/engines/mssql/MsSqlAnalyser.js b/api/src/engines/mssql/MsSqlAnalyser.js index f1453a0d3..22421f8f4 100644 --- a/api/src/engines/mssql/MsSqlAnalyser.js +++ b/api/src/engines/mssql/MsSqlAnalyser.js @@ -16,7 +16,7 @@ function extractPrimaryKeys(table, pkColumns) { const filtered = pkColumns.filter(byTableFilter(table)); if (filtered.length == 0) return undefined; return { - constraintName: filtered[0].constraintName, + ..._.pick(filtered[0], ['constraintName', 'schemaName', 'pureName']), constraintType: 'primaryKey', columns: filtered.map(fp.pick('columnName')), }; @@ -27,7 +27,15 @@ function extractForeignKeys(table, fkColumns) { return _.keys(grouped).map(constraintName => ({ constraintName, constraintType: 'foreignKey', - ..._.pick(fkColumns[0], ['refSchemaName', 'refTableName', 'updateAction', 'deleteAction']), + ..._.pick(grouped[constraintName][0], [ + 'constraintName', + 'schemaName', + 'pureName', + 'refSchemaName', + 'refTableName', + 'updateAction', + 'deleteAction', + ]), columns: grouped[constraintName].map(fp.pick(['columnName', 'refColumnName'])), })); } diff --git a/types/dbinfo.d.ts b/types/dbinfo.d.ts index f147fc7a6..8b957265d 100644 --- a/types/dbinfo.d.ts +++ b/types/dbinfo.d.ts @@ -8,7 +8,7 @@ export interface ColumnReference { refColumnName?: string; } -export interface ConstraintInfo { +export interface ConstraintInfo extends NamedObjectInfo { constraintName: string; constraintType: string; } @@ -44,6 +44,7 @@ export interface TableInfo extends NamedObjectInfo { columns: ColumnInfo[]; primaryKey?: PrimaryKeyInfo; foreignKeys: ForeignKeyInfo[]; + dependencies?: ForeignKeyInfo[]; } export interface DatabaseInfo { tables: TableInfo[]; diff --git a/web/src/tabs/TableStructureTab.js b/web/src/tabs/TableStructureTab.js index 5d9a6adb2..9ca2010d9 100644 --- a/web/src/tabs/TableStructureTab.js +++ b/web/src/tabs/TableStructureTab.js @@ -24,7 +24,7 @@ export default function TableStructureTab({ conid, database, schemaName, pureNam params: { conid, database, schemaName, pureName }, }); if (!tableInfo) return null; - const { columns, primaryKey, foreignKeys } = tableInfo; + const { columns, primaryKey, foreignKeys, dependencies } = tableInfo; return ( + + + row.columns.map(x => x.columnName).join(', ')} + /> + row.pureName} /> + row.columns.map(x => x.refColumnName).join(', ')} + /> + + + ); }