mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-30 22:03:58 +00:00
support separate schemas for mssql
This commit is contained in:
@@ -109,7 +109,7 @@ const engines = [
|
|||||||
],
|
],
|
||||||
supportSchemas: true,
|
supportSchemas: true,
|
||||||
defaultSchemaName: 'dbo',
|
defaultSchemaName: 'dbo',
|
||||||
skipSeparateSchemas: true,
|
// skipSeparateSchemas: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'SQLite',
|
label: 'SQLite',
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import _pick from 'lodash/pick';
|
|||||||
import _compact from 'lodash/compact';
|
import _compact from 'lodash/compact';
|
||||||
import { getLogger } from './getLogger';
|
import { getLogger } from './getLogger';
|
||||||
import { type Logger } from 'pinomin';
|
import { type Logger } from 'pinomin';
|
||||||
|
import { isCompositeDbName, splitCompositeDbName } from './schemaInfoTools';
|
||||||
|
|
||||||
const logger = getLogger('dbAnalyser');
|
const logger = getLogger('dbAnalyser');
|
||||||
|
|
||||||
@@ -180,8 +181,19 @@ export class DatabaseAnalyser {
|
|||||||
// return this.createQueryCore('=OBJECT_ID_CONDITION', typeFields) != ' is not null';
|
// return this.createQueryCore('=OBJECT_ID_CONDITION', typeFields) != ' is not null';
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
getDefaultSchemaNameCondition() {
|
||||||
|
return 'is not null';
|
||||||
|
}
|
||||||
|
|
||||||
createQuery(template, typeFields, replacements = {}) {
|
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) {
|
processQueryReplacements(query, replacements) {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ const _ = require('lodash');
|
|||||||
const stream = require('stream');
|
const stream = require('stream');
|
||||||
const makeUniqueColumnNames = require('./makeUniqueColumnNames');
|
const makeUniqueColumnNames = require('./makeUniqueColumnNames');
|
||||||
let requireMsnodesqlv8;
|
let requireMsnodesqlv8;
|
||||||
|
const { extractDbNameFromComposite } = global.DBGATE_PACKAGES['dbgate-tools'];
|
||||||
|
|
||||||
// async function nativeQueryCore(pool, sql, options) {
|
// async function nativeQueryCore(pool, sql, options) {
|
||||||
// if (sql == null) {
|
// if (sql == null) {
|
||||||
@@ -57,7 +58,7 @@ async function connectWithDriver({ server, port, user, password, database, authT
|
|||||||
connectionString += `;Driver={${driver}}`;
|
connectionString += `;Driver={${driver}}`;
|
||||||
if (authType == 'sspi') connectionString += ';Trusted_Connection=Yes';
|
if (authType == 'sspi') connectionString += ';Trusted_Connection=Yes';
|
||||||
else connectionString += `;UID=${user};PWD=${password}`;
|
else connectionString += `;UID=${user};PWD=${password}`;
|
||||||
if (database) connectionString += `;Database=${database}`;
|
if (database) connectionString += `;Database=${extractDbNameFromComposite(database)}`;
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
getMsnodesqlv8().open(connectionString, (err, conn) => {
|
getMsnodesqlv8().open(connectionString, (err, conn) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|||||||
@@ -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
|
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.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
|
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
|
order by c.column_id
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -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.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
|
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
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ select
|
|||||||
c.is_descending_key as isDescending, c.is_included_column as isIncludedColumn
|
c.is_descending_key as isDescending, c.is_included_column as isIncludedColumn
|
||||||
from sys.index_columns c
|
from sys.index_columns c
|
||||||
inner join sys.columns col on c.object_id = col.object_id and c.column_id = col.column_id
|
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
|
order by c.key_ordinal
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
module.exports = `
|
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
|
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
|
where i.is_primary_key=0
|
||||||
and i.is_hypothetical=0 and indexproperty(i.object_id, i.name, 'IsStatistics') = 0
|
and i.is_hypothetical=0 and indexproperty(i.object_id, i.name, 'IsStatistics') = 0
|
||||||
and objectproperty(i.object_id, 'IsUserTable') = 1
|
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
|
-- where o.parent_obj = i.object_id
|
||||||
-- and objectproperty(o.id, N'isConstraint') = 1.0)
|
-- 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
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ select s.name as pureName, u.name as schemaName, c.text AS codeText
|
|||||||
from sys.objects s
|
from sys.objects s
|
||||||
inner join sys.syscomments c on s.object_id = c.id
|
inner join sys.syscomments c on s.object_id = c.id
|
||||||
inner join sys.schemas u on u.schema_id = s.schema_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
|
order by u.name, s.name, c.colid
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -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
|
from sys.objects o
|
||||||
inner join sys.schemas s on o.schema_id = s.schema_id
|
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
|
where o.type in ('U', 'V', 'P', 'IF', 'FN', 'TF') -- , 'TR' - triggers disabled
|
||||||
|
and s.name =SCHEMA_NAME_CONDITION
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -11,4 +11,5 @@ where
|
|||||||
and c.Table_Name = t.Table_Name
|
and c.Table_Name = t.Table_Name
|
||||||
and Constraint_Type = 'PRIMARY KEY'
|
and Constraint_Type = 'PRIMARY KEY'
|
||||||
and o.object_id =OBJECT_ID_CONDITION
|
and o.object_id =OBJECT_ID_CONDITION
|
||||||
|
and s.name =SCHEMA_NAME_CONDITION
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -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
|
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
|
from sys.objects o
|
||||||
inner join sys.schemas s on o.schema_id = s.schema_id
|
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
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -8,8 +8,11 @@ INNER JOIN
|
|||||||
sys.indexes i ON t.OBJECT_ID = i.object_id
|
sys.indexes i ON t.OBJECT_ID = i.object_id
|
||||||
INNER JOIN
|
INNER JOIN
|
||||||
sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
|
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
|
WHERE
|
||||||
t.NAME NOT LIKE 'dt%'
|
t.NAME NOT LIKE 'dt%'
|
||||||
AND t.is_ms_shipped = 0
|
AND t.is_ms_shipped = 0
|
||||||
AND i.OBJECT_ID > 255
|
AND i.OBJECT_ID > 255
|
||||||
|
AND s.name =SCHEMA_NAME_CONDITION
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ select
|
|||||||
o.create_date as createDate, o.modify_date as modifyDate
|
o.create_date as createDate, o.modify_date as modifyDate
|
||||||
from sys.tables o
|
from sys.tables o
|
||||||
inner join sys.schemas s on o.schema_id = s.schema_id
|
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
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -13,6 +13,6 @@ select
|
|||||||
FROM sys.objects o
|
FROM sys.objects o
|
||||||
INNER JOIN sys.schemas u ON u.schema_id=o.schema_id
|
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
|
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
|
order by col.ORDINAL_POSITION
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -6,5 +6,5 @@ SELECT
|
|||||||
o.create_date as createDate,
|
o.create_date as createDate,
|
||||||
o.modify_date as modifyDate
|
o.modify_date as modifyDate
|
||||||
FROM sys.objects o INNER JOIN sys.schemas u ON u.schema_id=o.schema_id
|
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
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ const _ = require('lodash');
|
|||||||
const stream = require('stream');
|
const stream = require('stream');
|
||||||
const tedious = require('tedious');
|
const tedious = require('tedious');
|
||||||
const makeUniqueColumnNames = require('./makeUniqueColumnNames');
|
const makeUniqueColumnNames = require('./makeUniqueColumnNames');
|
||||||
|
const { extractDbNameFromComposite } = global.DBGATE_PACKAGES['dbgate-tools'];
|
||||||
|
|
||||||
function extractTediousColumns(columns, addDriverNativeColumn = false) {
|
function extractTediousColumns(columns, addDriverNativeColumn = false) {
|
||||||
const res = columns.map(col => {
|
const res = columns.map(col => {
|
||||||
@@ -39,7 +40,7 @@ async function tediousConnect(storedConnection) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (database) {
|
if (database) {
|
||||||
connectionOptions.database = database;
|
connectionOptions.database = extractDbNameFromComposite(database);
|
||||||
}
|
}
|
||||||
|
|
||||||
const authentication =
|
const authentication =
|
||||||
|
|||||||
@@ -127,9 +127,17 @@ const driver = {
|
|||||||
return dialect;
|
return dialect;
|
||||||
},
|
},
|
||||||
showConnectionField: (field, values) =>
|
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 == 'trustServerCertificate' && values.authType != 'sql' && values.authType != 'sspi') ||
|
||||||
(field == 'windowsDomain' && values.authType != 'sql' && values.authType != 'sspi' && values.authType != 'msentra'),
|
(field == 'windowsDomain' && values.authType != 'sql' && values.authType != 'sspi' && values.authType != 'msentra'),
|
||||||
// (field == 'useDatabaseUrl' && values.authType != 'sql' && values.authType != 'sspi')
|
// (field == 'useDatabaseUrl' && values.authType != 'sql' && values.authType != 'sspi')
|
||||||
|
|||||||
@@ -57,13 +57,7 @@ class Analyser extends DatabaseAnalyser {
|
|||||||
|
|
||||||
createQuery(resFileName, typeFields, replacements = {}) {
|
createQuery(resFileName, typeFields, replacements = {}) {
|
||||||
const query = super.createQuery(sql[resFileName], typeFields, replacements);
|
const query = super.createQuery(sql[resFileName], typeFields, replacements);
|
||||||
const dbname = this.dbhan.database;
|
return query;
|
||||||
const schemaCondition = isCompositeDbName(dbname)
|
|
||||||
? `= '${splitCompositeDbName(dbname).schema}' `
|
|
||||||
: ' IS NOT NULL ';
|
|
||||||
// const schemaCondition = ' IS NOT NULL ';
|
|
||||||
|
|
||||||
return query?.replace(/=SCHEMA_NAME_CONDITION/g, schemaCondition);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async _computeSingleObjectId() {
|
async _computeSingleObjectId() {
|
||||||
|
|||||||
Reference in New Issue
Block a user