@dba-i/mssql-dba
Version:
The server provides a functionality to handle DBA tasks for SQL Server database, such as analyzing tables, assesing index health, and finding missing indices. Many more tasks are upcoming. **Currently we support only SQL Server Authenitcation** method. Fo
83 lines • 2.66 kB
JavaScript
import sql from 'mssql';
import fs from 'fs';
/**
* Represents a connection to an MSSQL database.
*/
export class MSSQL {
pool = null;
config;
constructor(config) {
this.config = config;
}
async executeQuery({ query, parameters, }) {
this.ensureConnected();
const request = this.pool.request();
if (parameters) {
for (const [key, value] of Object.entries(parameters)) {
request.input(key, value);
}
}
const result = await request.query(query);
return result.recordset;
}
/**
* Fetches metadata about the database such as size and free space in MB.
* @returns An object containing dbSizeMB and dbFreeSpaceMB.
*/
async getDatabaseMetadata() {
this.ensureConnected();
// Query to get database size in MB
const dbSizeQuery = `
SELECT
SUM(size) * 8.0 / 1024 AS dbSizeMB
FROM sys.database_files;
`;
// Query to get free space in MB
const dbFreeSpaceQuery = `
SELECT SUM(size - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)) * 8.0 / 1024 AS dbFreeSpaceMB
FROM sys.database_files;
`;
const dbSizeResult = await this.executeQuery({
query: dbSizeQuery,
});
const dbFreeSpaceResult = await this.executeQuery({ query: dbFreeSpaceQuery });
const dbSizeMB = dbSizeResult[0]?.dbSizeMB ?? 0;
const dbFreeSpaceMB = dbFreeSpaceResult[0]?.dbFreeSpaceMB ?? 0;
return { dbSizeMB, dbFreeSpaceMB };
}
// Utilities for permissions
async checkPermissions() {
this.ensureConnected();
const query = fs.readFileSync('src/sql/mssql/permissions/checkPermissions.sql', 'utf8');
const permissions = await this.executeQuery({ query });
return permissions.reduce((acc, { level, permission_name }) => {
if (!acc[level]) {
acc[level] = [];
}
if (!acc[level].includes(permission_name)) {
acc[level].push(permission_name);
}
return acc;
}, {});
}
// Utilities for connection management
async connect() {
if (this.isConnected()) {
return;
}
this.pool = await sql.connect(this.config);
}
async disconnect() {
await this.pool.close();
this.pool = null;
}
isConnected() {
return this.pool !== null;
}
ensureConnected() {
if (!this.isConnected()) {
throw new Error('Database connection is not established.');
}
}
}
//# sourceMappingURL=MSSQL.js.map