diff --git a/integration-tests/engines.js b/integration-tests/engines.js index 5773918b3..8ff17d6c6 100644 --- a/integration-tests/engines.js +++ b/integration-tests/engines.js @@ -109,7 +109,7 @@ const engines = [ ], supportSchemas: true, defaultSchemaName: 'dbo', - skipSeparateSchemas: true, + // skipSeparateSchemas: true, }, { label: 'SQLite', diff --git a/packages/tools/src/DatabaseAnalyser.ts b/packages/tools/src/DatabaseAnalyser.ts index 265e5d183..1c3d83a69 100644 --- a/packages/tools/src/DatabaseAnalyser.ts +++ b/packages/tools/src/DatabaseAnalyser.ts @@ -5,6 +5,7 @@ import _pick from 'lodash/pick'; import _compact from 'lodash/compact'; import { getLogger } from './getLogger'; import { type Logger } from 'pinomin'; +import { isCompositeDbName, splitCompositeDbName } from './schemaInfoTools'; const logger = getLogger('dbAnalyser'); @@ -180,8 +181,19 @@ export class DatabaseAnalyser { // return this.createQueryCore('=OBJECT_ID_CONDITION', typeFields) != ' is not null'; // } + getDefaultSchemaNameCondition() { + return 'is not null'; + } + createQuery(template, typeFields, replacements = {}) { - return this.createQueryCore(this.processQueryReplacements(template, replacements), typeFields); + let query = this.createQueryCore(this.processQueryReplacements(template, replacements), typeFields); + + const dbname = this.dbhan.database; + const schemaCondition = isCompositeDbName(dbname) + ? `= '${splitCompositeDbName(dbname).schema}' ` + : ` ${this.getDefaultSchemaNameCondition()} `; + + return query?.replace(/=SCHEMA_NAME_CONDITION/g, schemaCondition); } processQueryReplacements(query, replacements) { diff --git a/plugins/dbgate-plugin-mssql/src/backend/nativeDriver.js b/plugins/dbgate-plugin-mssql/src/backend/nativeDriver.js index dad4928af..6ba14f634 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/nativeDriver.js +++ b/plugins/dbgate-plugin-mssql/src/backend/nativeDriver.js @@ -2,6 +2,7 @@ const _ = require('lodash'); const stream = require('stream'); const makeUniqueColumnNames = require('./makeUniqueColumnNames'); let requireMsnodesqlv8; +const { extractDbNameFromComposite } = global.DBGATE_PACKAGES['dbgate-tools']; // async function nativeQueryCore(pool, sql, options) { // if (sql == null) { @@ -57,7 +58,7 @@ async function connectWithDriver({ server, port, user, password, database, authT connectionString += `;Driver={${driver}}`; if (authType == 'sspi') connectionString += ';Trusted_Connection=Yes'; else connectionString += `;UID=${user};PWD=${password}`; - if (database) connectionString += `;Database=${database}`; + if (database) connectionString += `;Database=${extractDbNameFromComposite(database)}`; return new Promise((resolve, reject) => { getMsnodesqlv8().open(connectionString, (err, conn) => { if (err) { diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/columns.js b/plugins/dbgate-plugin-mssql/src/backend/sql/columns.js index 9e61b2626..7a6ee8cf2 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/columns.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/columns.js @@ -15,6 +15,6 @@ INNER JOIN sys.schemas u ON u.schema_id=o.schema_id INNER JOIN INFORMATION_SCHEMA.COLUMNS col ON col.TABLE_NAME = o.name AND col.TABLE_SCHEMA = u.name and col.COLUMN_NAME = c.name left join sys.default_constraints d on c.default_object_id = d.object_id left join sys.computed_columns m on m.object_id = c.object_id and m.column_id = c.column_id -where o.type = 'U' and o.object_id =OBJECT_ID_CONDITION +where o.type = 'U' and o.object_id =OBJECT_ID_CONDITION and u.name =SCHEMA_NAME_CONDITION order by c.column_id `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/foreignKeys.js b/plugins/dbgate-plugin-mssql/src/backend/sql/foreignKeys.js index a00ed5717..234ba20ce 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/foreignKeys.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/foreignKeys.js @@ -36,5 +36,5 @@ LEFT JOIN sys.schemas IXS ON IXT.schema_id = IXS.schema_id inner join sys.objects o on FK.TABLE_NAME = o.name inner join sys.schemas s on o.schema_id = s.schema_id and FK.TABLE_SCHEMA = s.name -where o.object_id =OBJECT_ID_CONDITION +where o.object_id =OBJECT_ID_CONDITION and s.name =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/indexcols.js b/plugins/dbgate-plugin-mssql/src/backend/sql/indexcols.js index 7dbb8a64b..fb1e37036 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/indexcols.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/indexcols.js @@ -5,6 +5,8 @@ select c.is_descending_key as isDescending, c.is_included_column as isIncludedColumn from sys.index_columns c inner join sys.columns col on c.object_id = col.object_id and c.column_id = col.column_id -where c.object_id =OBJECT_ID_CONDITION +inner join sys.objects o on c.object_id = o.object_id +INNER JOIN sys.schemas u ON u.schema_id=o.schema_id +where c.object_id =OBJECT_ID_CONDITION and u.name =SCHEMA_NAME_CONDITION order by c.key_ordinal `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/indexes.js b/plugins/dbgate-plugin-mssql/src/backend/sql/indexes.js index 4ba26f1bc..a685472d1 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/indexes.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/indexes.js @@ -1,5 +1,7 @@ module.exports = ` select i.object_id, i.name as constraintName, i.type_desc as indexType, i.is_unique as isUnique,i.index_id, i.is_unique_constraint from sys.indexes i +inner join sys.objects o on i.object_id = o.object_id +INNER JOIN sys.schemas u ON u.schema_id=o.schema_id where i.is_primary_key=0 and i.is_hypothetical=0 and indexproperty(i.object_id, i.name, 'IsStatistics') = 0 and objectproperty(i.object_id, 'IsUserTable') = 1 @@ -10,5 +12,5 @@ and i.index_id between 1 and 254 -- where o.parent_obj = i.object_id -- and objectproperty(o.id, N'isConstraint') = 1.0) - and i.object_id =OBJECT_ID_CONDITION + and i.object_id =OBJECT_ID_CONDITION and u.name =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/loadSqlCode.js b/plugins/dbgate-plugin-mssql/src/backend/sql/loadSqlCode.js index ea242b0e8..c9abd34f8 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/loadSqlCode.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/loadSqlCode.js @@ -3,6 +3,6 @@ select s.name as pureName, u.name as schemaName, c.text AS codeText from sys.objects s inner join sys.syscomments c on s.object_id = c.id inner join sys.schemas u on u.schema_id = s.schema_id -where (s.object_id =OBJECT_ID_CONDITION) +where (s.object_id =OBJECT_ID_CONDITION) and u.name =SCHEMA_NAME_CONDITION order by u.name, s.name, c.colid `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/modifications.js b/plugins/dbgate-plugin-mssql/src/backend/sql/modifications.js index 4389fd6ca..b1a2fec1d 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/modifications.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/modifications.js @@ -3,4 +3,5 @@ select o.object_id as objectId, o.modify_date as modifyDate, o.type, o.name as p from sys.objects o inner join sys.schemas s on o.schema_id = s.schema_id where o.type in ('U', 'V', 'P', 'IF', 'FN', 'TF') -- , 'TR' - triggers disabled + and s.name =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/primaryKeys.js b/plugins/dbgate-plugin-mssql/src/backend/sql/primaryKeys.js index 24b9fc3e0..2d6ffc311 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/primaryKeys.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/primaryKeys.js @@ -11,4 +11,5 @@ where and c.Table_Name = t.Table_Name and Constraint_Type = 'PRIMARY KEY' and o.object_id =OBJECT_ID_CONDITION + and s.name =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/programmables.js b/plugins/dbgate-plugin-mssql/src/backend/sql/programmables.js index 565bb776c..2f0489540 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/programmables.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/programmables.js @@ -2,5 +2,5 @@ module.exports = ` select o.name as pureName, s.name as schemaName, o.object_id as objectId, o.create_date as createDate, o.modify_date as modifyDate, o.type as sqlObjectType from sys.objects o inner join sys.schemas s on o.schema_id = s.schema_id -where o.type in ('P', 'IF', 'FN', 'TF') and o.object_id =OBJECT_ID_CONDITION +where o.type in ('P', 'IF', 'FN', 'TF') and o.object_id =OBJECT_ID_CONDITION and s.name =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/tableSizes.js b/plugins/dbgate-plugin-mssql/src/backend/sql/tableSizes.js index 896ef0cab..70a1ddd4b 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/tableSizes.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/tableSizes.js @@ -8,8 +8,11 @@ INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id +INNER JOIN + sys.schemas s ON t.schema_id = s.schema_id WHERE t.NAME NOT LIKE 'dt%' AND t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 + AND s.name =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/tables.js b/plugins/dbgate-plugin-mssql/src/backend/sql/tables.js index b4886d4a2..32dace94d 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/tables.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/tables.js @@ -4,5 +4,5 @@ select o.create_date as createDate, o.modify_date as modifyDate from sys.tables o inner join sys.schemas s on o.schema_id = s.schema_id -where o.object_id =OBJECT_ID_CONDITION +where o.object_id =OBJECT_ID_CONDITION and s.name =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/viewColumns.js b/plugins/dbgate-plugin-mssql/src/backend/sql/viewColumns.js index 08caca7b7..9ad4a7bf0 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/viewColumns.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/viewColumns.js @@ -13,6 +13,6 @@ select FROM sys.objects o INNER JOIN sys.schemas u ON u.schema_id=o.schema_id INNER JOIN INFORMATION_SCHEMA.COLUMNS col ON col.TABLE_NAME = o.name AND col.TABLE_SCHEMA = u.name -WHERE o.type in ('V') and o.object_id =OBJECT_ID_CONDITION +WHERE o.type in ('V') and o.object_id =OBJECT_ID_CONDITION and u.name =SCHEMA_NAME_CONDITION order by col.ORDINAL_POSITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/sql/views.js b/plugins/dbgate-plugin-mssql/src/backend/sql/views.js index e1436d712..3f746ed64 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/sql/views.js +++ b/plugins/dbgate-plugin-mssql/src/backend/sql/views.js @@ -6,5 +6,5 @@ SELECT o.create_date as createDate, o.modify_date as modifyDate FROM sys.objects o INNER JOIN sys.schemas u ON u.schema_id=o.schema_id -WHERE type in ('V') and o.object_id =OBJECT_ID_CONDITION +WHERE type in ('V') and o.object_id =OBJECT_ID_CONDITION and u.name =SCHEMA_NAME_CONDITION `; diff --git a/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js b/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js index c10204f62..f93234bf1 100644 --- a/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js +++ b/plugins/dbgate-plugin-mssql/src/backend/tediousDriver.js @@ -2,6 +2,7 @@ const _ = require('lodash'); const stream = require('stream'); const tedious = require('tedious'); const makeUniqueColumnNames = require('./makeUniqueColumnNames'); +const { extractDbNameFromComposite } = global.DBGATE_PACKAGES['dbgate-tools']; function extractTediousColumns(columns, addDriverNativeColumn = false) { const res = columns.map(col => { @@ -39,7 +40,7 @@ async function tediousConnect(storedConnection) { }; if (database) { - connectionOptions.database = database; + connectionOptions.database = extractDbNameFromComposite(database); } const authentication = diff --git a/plugins/dbgate-plugin-mssql/src/frontend/driver.js b/plugins/dbgate-plugin-mssql/src/frontend/driver.js index 9d58bb041..f9f1e3faa 100644 --- a/plugins/dbgate-plugin-mssql/src/frontend/driver.js +++ b/plugins/dbgate-plugin-mssql/src/frontend/driver.js @@ -127,9 +127,17 @@ const driver = { return dialect; }, showConnectionField: (field, values) => - ['authType', 'server', 'port', 'user', 'password', 'defaultDatabase', 'singleDatabase', 'isReadOnly'].includes( - field - ) || + [ + 'authType', + 'server', + 'port', + 'user', + 'password', + 'defaultDatabase', + 'singleDatabase', + 'isReadOnly', + 'useSeparateSchemas', + ].includes(field) || (field == 'trustServerCertificate' && values.authType != 'sql' && values.authType != 'sspi') || (field == 'windowsDomain' && values.authType != 'sql' && values.authType != 'sspi' && values.authType != 'msentra'), // (field == 'useDatabaseUrl' && values.authType != 'sql' && values.authType != 'sspi') diff --git a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js index e2f87b848..6eeed9373 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js @@ -57,15 +57,9 @@ class Analyser extends DatabaseAnalyser { createQuery(resFileName, typeFields, replacements = {}) { const query = super.createQuery(sql[resFileName], typeFields, replacements); - const dbname = this.dbhan.database; - const schemaCondition = isCompositeDbName(dbname) - ? `= '${splitCompositeDbName(dbname).schema}' ` - : ' IS NOT NULL '; - // const schemaCondition = ' IS NOT NULL '; - - return query?.replace(/=SCHEMA_NAME_CONDITION/g, schemaCondition); + return query; } - + async _computeSingleObjectId() { const { typeField, schemaName, pureName } = this.singleObjectFilter; this.singleObjectId = `${typeField}:${schemaName || 'public'}.${pureName}`;