@bilims/mcp-sqlserver
Version:
MCP Server for Microsoft SQL Server with CRUD operations and data analysis capabilities
156 lines • 5.23 kB
JavaScript
import { z } from 'zod';
export const BeginTransactionSchema = z.object({
isolationLevel: z.enum(['READ_UNCOMMITTED', 'READ_COMMITTED', 'REPEATABLE_READ', 'SNAPSHOT', 'SERIALIZABLE']).optional().default('READ_COMMITTED'),
transactionName: z.string().optional(),
});
export const CommitTransactionSchema = z.object({
transactionName: z.string().optional(),
});
export const RollbackTransactionSchema = z.object({
transactionName: z.string().optional(),
savepoint: z.string().optional(),
});
export const CreateSavepointSchema = z.object({
savepointName: z.string().min(1, 'Savepoint name is required'),
});
export class TransactionTools {
db;
constructor(db) {
this.db = db;
}
getIsolationLevelSql(level) {
switch (level) {
case 'READ_UNCOMMITTED':
return 'READ UNCOMMITTED';
case 'READ_COMMITTED':
return 'READ COMMITTED';
case 'REPEATABLE_READ':
return 'REPEATABLE READ';
case 'SNAPSHOT':
return 'SNAPSHOT';
case 'SERIALIZABLE':
return 'SERIALIZABLE';
default:
return 'READ COMMITTED';
}
}
async beginTransaction(params) {
const pool = this.db.getPool();
const request = pool.request();
let query = `SET TRANSACTION ISOLATION LEVEL ${this.getIsolationLevelSql(params.isolationLevel)}`;
if (params.transactionName) {
query += `; BEGIN TRANSACTION [${params.transactionName}]`;
}
else {
query += `; BEGIN TRANSACTION`;
}
await request.query(query);
return {
success: true,
transactionStarted: true,
isolationLevel: params.isolationLevel,
transactionName: params.transactionName,
message: `Transaction started with isolation level: ${params.isolationLevel}`
};
}
async commitTransaction(params) {
const pool = this.db.getPool();
const request = pool.request();
let query = 'COMMIT TRANSACTION';
if (params.transactionName) {
query = `COMMIT TRANSACTION [${params.transactionName}]`;
}
await request.query(query);
return {
success: true,
transactionCommitted: true,
transactionName: params.transactionName,
message: 'Transaction committed successfully'
};
}
async rollbackTransaction(params) {
const pool = this.db.getPool();
const request = pool.request();
let query = 'ROLLBACK TRANSACTION';
if (params.savepoint) {
query = `ROLLBACK TRANSACTION [${params.savepoint}]`;
}
else if (params.transactionName) {
query = `ROLLBACK TRANSACTION [${params.transactionName}]`;
}
await request.query(query);
return {
success: true,
transactionRolledBack: true,
transactionName: params.transactionName,
savepoint: params.savepoint,
message: params.savepoint ? `Rolled back to savepoint: ${params.savepoint}` : 'Transaction rolled back successfully'
};
}
async createSavepoint(params) {
const pool = this.db.getPool();
const request = pool.request();
const query = `SAVE TRANSACTION [${params.savepointName}]`;
await request.query(query);
return {
success: true,
savepointCreated: true,
savepointName: params.savepointName,
message: `Savepoint '${params.savepointName}' created successfully`
};
}
async getTransactionStatus() {
const pool = this.db.getPool();
const request = pool.request();
const query = `
SELECT
@@TRANCOUNT as open_transactions,
CASE
WHEN @@TRANCOUNT > 0 THEN 'Active'
ELSE 'None'
END as transaction_status,
CASE
WHEN @@OPTIONS & 1 = 1 THEN 'ON'
ELSE 'OFF'
END as disable_def_cnst_chk,
CASE
WHEN @@OPTIONS & 2 = 2 THEN 'ON'
ELSE 'OFF'
END as implicit_transactions,
CASE
WHEN @@OPTIONS & 4 = 4 THEN 'ON'
ELSE 'OFF'
END as cursor_close_on_commit,
CASE
WHEN @@OPTIONS & 8 = 8 THEN 'ON'
ELSE 'OFF'
END as ansi_warnings,
CASE
WHEN @@OPTIONS & 16 = 16 THEN 'ON'
ELSE 'OFF'
END as ansi_padding,
CASE
WHEN @@OPTIONS & 32 = 32 THEN 'ON'
ELSE 'OFF'
END as ansi_nulls,
CASE
WHEN @@OPTIONS & 64 = 64 THEN 'ON'
ELSE 'OFF'
END as arithabort,
CASE
WHEN @@OPTIONS & 128 = 128 THEN 'ON'
ELSE 'OFF'
END as arithignore,
CASE
WHEN @@OPTIONS & 256 = 256 THEN 'ON'
ELSE 'OFF'
END as quoted_identifier
`;
const result = await request.query(query);
return {
success: true,
transactionInfo: result.recordset[0]
};
}
}
//# sourceMappingURL=transaction-tools.js.map