@elad-nofy/mssql-mcp 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -1
- package/dist/config.d.ts +2 -2
- package/dist/config.js +4 -4
- package/dist/config.js.map +1 -1
- package/dist/index.js +48 -16
- package/dist/index.js.map +1 -1
- package/dist/mssqlClient.d.ts +6 -4
- package/dist/mssqlClient.d.ts.map +1 -1
- package/dist/mssqlClient.js +49 -20
- package/dist/mssqlClient.js.map +1 -1
- package/dist/tools/availability.d.ts +30 -10
- package/dist/tools/availability.d.ts.map +1 -1
- package/dist/tools/availability.js +18 -12
- package/dist/tools/availability.js.map +1 -1
- package/dist/tools/connection.d.ts +26 -5
- package/dist/tools/connection.d.ts.map +1 -1
- package/dist/tools/connection.js +14 -8
- package/dist/tools/connection.js.map +1 -1
- package/dist/tools/health.d.ts +42 -10
- package/dist/tools/health.d.ts.map +1 -1
- package/dist/tools/health.js +22 -13
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/jobs.d.ts +25 -5
- package/dist/tools/jobs.d.ts.map +1 -1
- package/dist/tools/jobs.js +12 -6
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/performance.d.ts +26 -6
- package/dist/tools/performance.d.ts.map +1 -1
- package/dist/tools/performance.js +12 -6
- package/dist/tools/performance.js.map +1 -1
- package/dist/tools/queries.d.ts +15 -3
- package/dist/tools/queries.d.ts.map +1 -1
- package/dist/tools/queries.js +7 -3
- package/dist/tools/queries.js.map +1 -1
- package/dist/tools/schema.d.ts +230 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +374 -0
- package/dist/tools/schema.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const serverParam = z.string().optional().describe('SQL Server instance (e.g., "server\\instance" or "server,port"). Uses default if not specified.');
|
|
3
|
+
export const schemaTools = {
|
|
4
|
+
get_tables: {
|
|
5
|
+
description: 'List all tables in a database with row counts, sizes, and metadata',
|
|
6
|
+
inputSchema: z.object({
|
|
7
|
+
server: serverParam,
|
|
8
|
+
database: z.string().describe('Database name'),
|
|
9
|
+
schema: z.string().optional().describe('Filter by schema name (e.g., dbo)'),
|
|
10
|
+
includeRowCounts: z.boolean().optional().default(true).describe('Include row counts (may be slow on large databases)'),
|
|
11
|
+
}),
|
|
12
|
+
handler: async (client, args) => {
|
|
13
|
+
const schemaFilter = args.schema ? `AND s.name = '${args.schema}'` : '';
|
|
14
|
+
const query = `
|
|
15
|
+
USE [${args.database}];
|
|
16
|
+
|
|
17
|
+
SELECT
|
|
18
|
+
s.name as schema_name,
|
|
19
|
+
t.name as table_name,
|
|
20
|
+
t.create_date,
|
|
21
|
+
t.modify_date,
|
|
22
|
+
${args.includeRowCounts ? `
|
|
23
|
+
p.rows as row_count,
|
|
24
|
+
CAST(SUM(a.total_pages) * 8.0 / 1024 AS DECIMAL(10,2)) as total_size_mb,
|
|
25
|
+
CAST(SUM(a.used_pages) * 8.0 / 1024 AS DECIMAL(10,2)) as used_size_mb,
|
|
26
|
+
` : ''}
|
|
27
|
+
(SELECT COUNT(*) FROM sys.columns c WHERE c.object_id = t.object_id) as column_count,
|
|
28
|
+
(SELECT COUNT(*) FROM sys.indexes i WHERE i.object_id = t.object_id AND i.is_primary_key = 0 AND i.type > 0) as index_count,
|
|
29
|
+
ISNULL((SELECT COUNT(*) FROM sys.foreign_keys fk WHERE fk.parent_object_id = t.object_id), 0) as fk_count,
|
|
30
|
+
OBJECTPROPERTY(t.object_id, 'TableHasPrimaryKey') as has_primary_key,
|
|
31
|
+
OBJECTPROPERTY(t.object_id, 'TableHasIdentity') as has_identity
|
|
32
|
+
FROM sys.tables t
|
|
33
|
+
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
34
|
+
${args.includeRowCounts ? `
|
|
35
|
+
LEFT JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id IN (0, 1)
|
|
36
|
+
LEFT JOIN sys.allocation_units a ON p.partition_id = a.container_id
|
|
37
|
+
` : ''}
|
|
38
|
+
WHERE t.is_ms_shipped = 0
|
|
39
|
+
${schemaFilter}
|
|
40
|
+
GROUP BY s.name, t.name, t.object_id, t.create_date, t.modify_date
|
|
41
|
+
${args.includeRowCounts ? ', p.rows' : ''}
|
|
42
|
+
ORDER BY s.name, t.name
|
|
43
|
+
`;
|
|
44
|
+
return await client.query(query, undefined, args.server);
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
get_columns: {
|
|
48
|
+
description: 'Get column definitions for a specific table',
|
|
49
|
+
inputSchema: z.object({
|
|
50
|
+
server: serverParam,
|
|
51
|
+
database: z.string().describe('Database name'),
|
|
52
|
+
table: z.string().describe('Table name'),
|
|
53
|
+
schema: z.string().optional().default('dbo').describe('Schema name'),
|
|
54
|
+
}),
|
|
55
|
+
handler: async (client, args) => {
|
|
56
|
+
const query = `
|
|
57
|
+
USE [${args.database}];
|
|
58
|
+
|
|
59
|
+
SELECT
|
|
60
|
+
c.column_id as ordinal_position,
|
|
61
|
+
c.name as column_name,
|
|
62
|
+
t.name as data_type,
|
|
63
|
+
c.max_length,
|
|
64
|
+
c.precision,
|
|
65
|
+
c.scale,
|
|
66
|
+
c.is_nullable,
|
|
67
|
+
c.is_identity,
|
|
68
|
+
c.is_computed,
|
|
69
|
+
ISNULL(dc.definition, '') as default_value,
|
|
70
|
+
ISNULL(cc.definition, '') as computed_definition,
|
|
71
|
+
CASE WHEN pk.column_id IS NOT NULL THEN 1 ELSE 0 END as is_primary_key,
|
|
72
|
+
CASE WHEN fk.parent_column_id IS NOT NULL THEN 1 ELSE 0 END as is_foreign_key,
|
|
73
|
+
ISNULL(fk_ref.referenced_table, '') as fk_references,
|
|
74
|
+
ISNULL(ep.value, '') as description
|
|
75
|
+
FROM sys.columns c
|
|
76
|
+
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
|
|
77
|
+
INNER JOIN sys.tables tbl ON c.object_id = tbl.object_id
|
|
78
|
+
INNER JOIN sys.schemas s ON tbl.schema_id = s.schema_id
|
|
79
|
+
LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
|
|
80
|
+
LEFT JOIN sys.computed_columns cc ON c.object_id = cc.object_id AND c.column_id = cc.column_id
|
|
81
|
+
LEFT JOIN (
|
|
82
|
+
SELECT ic.object_id, ic.column_id
|
|
83
|
+
FROM sys.index_columns ic
|
|
84
|
+
INNER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
|
|
85
|
+
WHERE i.is_primary_key = 1
|
|
86
|
+
) pk ON c.object_id = pk.object_id AND c.column_id = pk.column_id
|
|
87
|
+
LEFT JOIN sys.foreign_key_columns fk ON c.object_id = fk.parent_object_id AND c.column_id = fk.parent_column_id
|
|
88
|
+
LEFT JOIN (
|
|
89
|
+
SELECT
|
|
90
|
+
fkc.parent_object_id,
|
|
91
|
+
fkc.parent_column_id,
|
|
92
|
+
OBJECT_SCHEMA_NAME(fkc.referenced_object_id) + '.' + OBJECT_NAME(fkc.referenced_object_id) + '.' + COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) as referenced_table
|
|
93
|
+
FROM sys.foreign_key_columns fkc
|
|
94
|
+
) fk_ref ON c.object_id = fk_ref.parent_object_id AND c.column_id = fk_ref.parent_column_id
|
|
95
|
+
LEFT JOIN sys.extended_properties ep ON c.object_id = ep.major_id AND c.column_id = ep.minor_id AND ep.name = 'MS_Description'
|
|
96
|
+
WHERE tbl.name = @table AND s.name = @schema
|
|
97
|
+
ORDER BY c.column_id
|
|
98
|
+
`;
|
|
99
|
+
return await client.query(query, { table: args.table, schema: args.schema || 'dbo' }, args.server);
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
get_stored_procedures: {
|
|
103
|
+
description: 'List stored procedures with optional code view',
|
|
104
|
+
inputSchema: z.object({
|
|
105
|
+
server: serverParam,
|
|
106
|
+
database: z.string().describe('Database name'),
|
|
107
|
+
schema: z.string().optional().describe('Filter by schema name'),
|
|
108
|
+
name: z.string().optional().describe('Filter by procedure name (supports wildcards with %)'),
|
|
109
|
+
includeCode: z.boolean().optional().default(false).describe('Include procedure source code'),
|
|
110
|
+
}),
|
|
111
|
+
handler: async (client, args) => {
|
|
112
|
+
const schemaFilter = args.schema ? `AND s.name = '${args.schema}'` : '';
|
|
113
|
+
const nameFilter = args.name ? `AND p.name LIKE '${args.name}'` : '';
|
|
114
|
+
const query = `
|
|
115
|
+
USE [${args.database}];
|
|
116
|
+
|
|
117
|
+
SELECT
|
|
118
|
+
s.name as schema_name,
|
|
119
|
+
p.name as procedure_name,
|
|
120
|
+
p.create_date,
|
|
121
|
+
p.modify_date,
|
|
122
|
+
${args.includeCode ? 'OBJECT_DEFINITION(p.object_id) as definition,' : ''}
|
|
123
|
+
(SELECT COUNT(*) FROM sys.parameters pm WHERE pm.object_id = p.object_id) as parameter_count
|
|
124
|
+
FROM sys.procedures p
|
|
125
|
+
INNER JOIN sys.schemas s ON p.schema_id = s.schema_id
|
|
126
|
+
WHERE p.is_ms_shipped = 0
|
|
127
|
+
${schemaFilter}
|
|
128
|
+
${nameFilter}
|
|
129
|
+
ORDER BY s.name, p.name
|
|
130
|
+
`;
|
|
131
|
+
return await client.query(query, undefined, args.server);
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
get_functions: {
|
|
135
|
+
description: 'List user-defined functions with optional code view',
|
|
136
|
+
inputSchema: z.object({
|
|
137
|
+
server: serverParam,
|
|
138
|
+
database: z.string().describe('Database name'),
|
|
139
|
+
schema: z.string().optional().describe('Filter by schema name'),
|
|
140
|
+
type: z.enum(['all', 'scalar', 'table', 'inline']).optional().default('all').describe('Function type filter'),
|
|
141
|
+
includeCode: z.boolean().optional().default(false).describe('Include function source code'),
|
|
142
|
+
}),
|
|
143
|
+
handler: async (client, args) => {
|
|
144
|
+
const schemaFilter = args.schema ? `AND s.name = '${args.schema}'` : '';
|
|
145
|
+
const typeMap = {
|
|
146
|
+
'scalar': "AND o.type = 'FN'",
|
|
147
|
+
'table': "AND o.type = 'TF'",
|
|
148
|
+
'inline': "AND o.type = 'IF'",
|
|
149
|
+
'all': '',
|
|
150
|
+
};
|
|
151
|
+
const typeFilter = typeMap[args.type || 'all'];
|
|
152
|
+
const query = `
|
|
153
|
+
USE [${args.database}];
|
|
154
|
+
|
|
155
|
+
SELECT
|
|
156
|
+
s.name as schema_name,
|
|
157
|
+
o.name as function_name,
|
|
158
|
+
CASE o.type
|
|
159
|
+
WHEN 'FN' THEN 'Scalar'
|
|
160
|
+
WHEN 'TF' THEN 'Table-valued'
|
|
161
|
+
WHEN 'IF' THEN 'Inline table-valued'
|
|
162
|
+
ELSE o.type
|
|
163
|
+
END as function_type,
|
|
164
|
+
o.create_date,
|
|
165
|
+
o.modify_date,
|
|
166
|
+
${args.includeCode ? 'OBJECT_DEFINITION(o.object_id) as definition,' : ''}
|
|
167
|
+
(SELECT COUNT(*) FROM sys.parameters pm WHERE pm.object_id = o.object_id AND pm.parameter_id > 0) as parameter_count
|
|
168
|
+
FROM sys.objects o
|
|
169
|
+
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
|
|
170
|
+
WHERE o.type IN ('FN', 'TF', 'IF')
|
|
171
|
+
AND o.is_ms_shipped = 0
|
|
172
|
+
${schemaFilter}
|
|
173
|
+
${typeFilter}
|
|
174
|
+
ORDER BY s.name, o.name
|
|
175
|
+
`;
|
|
176
|
+
return await client.query(query, undefined, args.server);
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
get_views: {
|
|
180
|
+
description: 'List views with optional definition',
|
|
181
|
+
inputSchema: z.object({
|
|
182
|
+
server: serverParam,
|
|
183
|
+
database: z.string().describe('Database name'),
|
|
184
|
+
schema: z.string().optional().describe('Filter by schema name'),
|
|
185
|
+
includeDefinition: z.boolean().optional().default(false).describe('Include view definition SQL'),
|
|
186
|
+
}),
|
|
187
|
+
handler: async (client, args) => {
|
|
188
|
+
const schemaFilter = args.schema ? `AND s.name = '${args.schema}'` : '';
|
|
189
|
+
const query = `
|
|
190
|
+
USE [${args.database}];
|
|
191
|
+
|
|
192
|
+
SELECT
|
|
193
|
+
s.name as schema_name,
|
|
194
|
+
v.name as view_name,
|
|
195
|
+
v.create_date,
|
|
196
|
+
v.modify_date,
|
|
197
|
+
${args.includeDefinition ? 'OBJECT_DEFINITION(v.object_id) as definition,' : ''}
|
|
198
|
+
(SELECT COUNT(*) FROM sys.columns c WHERE c.object_id = v.object_id) as column_count,
|
|
199
|
+
OBJECTPROPERTY(v.object_id, 'IsIndexed') as is_indexed,
|
|
200
|
+
OBJECTPROPERTY(v.object_id, 'IsSchemaBound') as is_schema_bound
|
|
201
|
+
FROM sys.views v
|
|
202
|
+
INNER JOIN sys.schemas s ON v.schema_id = s.schema_id
|
|
203
|
+
WHERE v.is_ms_shipped = 0
|
|
204
|
+
${schemaFilter}
|
|
205
|
+
ORDER BY s.name, v.name
|
|
206
|
+
`;
|
|
207
|
+
return await client.query(query, undefined, args.server);
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
get_foreign_keys: {
|
|
211
|
+
description: 'Get foreign key relationships between tables',
|
|
212
|
+
inputSchema: z.object({
|
|
213
|
+
server: serverParam,
|
|
214
|
+
database: z.string().describe('Database name'),
|
|
215
|
+
table: z.string().optional().describe('Filter by table name (shows FKs from and to this table)'),
|
|
216
|
+
}),
|
|
217
|
+
handler: async (client, args) => {
|
|
218
|
+
const tableFilter = args.table
|
|
219
|
+
? `AND (OBJECT_NAME(fk.parent_object_id) = '${args.table}' OR OBJECT_NAME(fk.referenced_object_id) = '${args.table}')`
|
|
220
|
+
: '';
|
|
221
|
+
const query = `
|
|
222
|
+
USE [${args.database}];
|
|
223
|
+
|
|
224
|
+
SELECT
|
|
225
|
+
fk.name as constraint_name,
|
|
226
|
+
OBJECT_SCHEMA_NAME(fk.parent_object_id) as from_schema,
|
|
227
|
+
OBJECT_NAME(fk.parent_object_id) as from_table,
|
|
228
|
+
COL_NAME(fkc.parent_object_id, fkc.parent_column_id) as from_column,
|
|
229
|
+
OBJECT_SCHEMA_NAME(fk.referenced_object_id) as to_schema,
|
|
230
|
+
OBJECT_NAME(fk.referenced_object_id) as to_table,
|
|
231
|
+
COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) as to_column,
|
|
232
|
+
fk.delete_referential_action_desc as on_delete,
|
|
233
|
+
fk.update_referential_action_desc as on_update,
|
|
234
|
+
fk.is_disabled,
|
|
235
|
+
fk.is_not_trusted
|
|
236
|
+
FROM sys.foreign_keys fk
|
|
237
|
+
INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
|
|
238
|
+
WHERE 1=1
|
|
239
|
+
${tableFilter}
|
|
240
|
+
ORDER BY from_schema, from_table, constraint_name, fkc.constraint_column_id
|
|
241
|
+
`;
|
|
242
|
+
return await client.query(query, undefined, args.server);
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
get_indexes: {
|
|
246
|
+
description: 'Get index information for tables',
|
|
247
|
+
inputSchema: z.object({
|
|
248
|
+
server: serverParam,
|
|
249
|
+
database: z.string().describe('Database name'),
|
|
250
|
+
table: z.string().optional().describe('Filter by table name'),
|
|
251
|
+
schema: z.string().optional().default('dbo').describe('Schema name'),
|
|
252
|
+
}),
|
|
253
|
+
handler: async (client, args) => {
|
|
254
|
+
const tableFilter = args.table ? `AND t.name = '${args.table}'` : '';
|
|
255
|
+
const schemaFilter = args.schema ? `AND s.name = '${args.schema}'` : '';
|
|
256
|
+
const query = `
|
|
257
|
+
USE [${args.database}];
|
|
258
|
+
|
|
259
|
+
SELECT
|
|
260
|
+
s.name as schema_name,
|
|
261
|
+
t.name as table_name,
|
|
262
|
+
i.name as index_name,
|
|
263
|
+
i.type_desc as index_type,
|
|
264
|
+
i.is_unique,
|
|
265
|
+
i.is_primary_key,
|
|
266
|
+
i.is_unique_constraint,
|
|
267
|
+
STUFF((
|
|
268
|
+
SELECT ', ' + c.name + CASE WHEN ic.is_descending_key = 1 THEN ' DESC' ELSE '' END
|
|
269
|
+
FROM sys.index_columns ic
|
|
270
|
+
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
271
|
+
WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.is_included_column = 0
|
|
272
|
+
ORDER BY ic.key_ordinal
|
|
273
|
+
FOR XML PATH('')
|
|
274
|
+
), 1, 2, '') as key_columns,
|
|
275
|
+
STUFF((
|
|
276
|
+
SELECT ', ' + c.name
|
|
277
|
+
FROM sys.index_columns ic
|
|
278
|
+
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
279
|
+
WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.is_included_column = 1
|
|
280
|
+
ORDER BY ic.index_column_id
|
|
281
|
+
FOR XML PATH('')
|
|
282
|
+
), 1, 2, '') as included_columns,
|
|
283
|
+
i.filter_definition,
|
|
284
|
+
ps.row_count,
|
|
285
|
+
CAST(ps.used_page_count * 8.0 / 1024 AS DECIMAL(10,2)) as size_mb
|
|
286
|
+
FROM sys.indexes i
|
|
287
|
+
INNER JOIN sys.tables t ON i.object_id = t.object_id
|
|
288
|
+
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
289
|
+
LEFT JOIN sys.dm_db_partition_stats ps ON i.object_id = ps.object_id AND i.index_id = ps.index_id
|
|
290
|
+
WHERE i.type > 0
|
|
291
|
+
${tableFilter}
|
|
292
|
+
${schemaFilter}
|
|
293
|
+
ORDER BY s.name, t.name, i.index_id
|
|
294
|
+
`;
|
|
295
|
+
return await client.query(query, undefined, args.server);
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
get_connected_users: {
|
|
299
|
+
description: 'Get currently connected users and sessions',
|
|
300
|
+
inputSchema: z.object({
|
|
301
|
+
server: serverParam,
|
|
302
|
+
database: z.string().optional().describe('Filter by database name'),
|
|
303
|
+
activeOnly: z.boolean().optional().default(false).describe('Only show sessions with active requests'),
|
|
304
|
+
}),
|
|
305
|
+
handler: async (client, args) => {
|
|
306
|
+
const dbFilter = args.database ? `AND DB_NAME(s.database_id) = '${args.database}'` : '';
|
|
307
|
+
const activeFilter = args.activeOnly ? 'AND r.session_id IS NOT NULL' : '';
|
|
308
|
+
const query = `
|
|
309
|
+
SELECT
|
|
310
|
+
s.session_id,
|
|
311
|
+
s.login_name,
|
|
312
|
+
s.host_name,
|
|
313
|
+
s.program_name,
|
|
314
|
+
DB_NAME(s.database_id) as database_name,
|
|
315
|
+
s.login_time,
|
|
316
|
+
s.last_request_start_time,
|
|
317
|
+
s.last_request_end_time,
|
|
318
|
+
s.status as session_status,
|
|
319
|
+
s.cpu_time as total_cpu_time,
|
|
320
|
+
s.memory_usage * 8 as memory_kb,
|
|
321
|
+
s.reads as total_reads,
|
|
322
|
+
s.writes as total_writes,
|
|
323
|
+
c.client_net_address,
|
|
324
|
+
c.auth_scheme,
|
|
325
|
+
r.status as request_status,
|
|
326
|
+
r.command,
|
|
327
|
+
r.wait_type,
|
|
328
|
+
r.blocking_session_id
|
|
329
|
+
FROM sys.dm_exec_sessions s
|
|
330
|
+
LEFT JOIN sys.dm_exec_connections c ON s.session_id = c.session_id
|
|
331
|
+
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
|
|
332
|
+
WHERE s.is_user_process = 1
|
|
333
|
+
${dbFilter}
|
|
334
|
+
${activeFilter}
|
|
335
|
+
ORDER BY s.login_time DESC
|
|
336
|
+
`;
|
|
337
|
+
return await client.query(query, undefined, args.server);
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
get_triggers: {
|
|
341
|
+
description: 'List triggers in a database',
|
|
342
|
+
inputSchema: z.object({
|
|
343
|
+
server: serverParam,
|
|
344
|
+
database: z.string().describe('Database name'),
|
|
345
|
+
table: z.string().optional().describe('Filter by table name'),
|
|
346
|
+
includeDefinition: z.boolean().optional().default(false).describe('Include trigger definition SQL'),
|
|
347
|
+
}),
|
|
348
|
+
handler: async (client, args) => {
|
|
349
|
+
const tableFilter = args.table ? `AND OBJECT_NAME(tr.parent_id) = '${args.table}'` : '';
|
|
350
|
+
const query = `
|
|
351
|
+
USE [${args.database}];
|
|
352
|
+
|
|
353
|
+
SELECT
|
|
354
|
+
OBJECT_SCHEMA_NAME(tr.parent_id) as schema_name,
|
|
355
|
+
OBJECT_NAME(tr.parent_id) as table_name,
|
|
356
|
+
tr.name as trigger_name,
|
|
357
|
+
tr.is_disabled,
|
|
358
|
+
tr.is_instead_of_trigger,
|
|
359
|
+
CASE WHEN OBJECTPROPERTY(tr.object_id, 'ExecIsInsertTrigger') = 1 THEN 'INSERT ' ELSE '' END +
|
|
360
|
+
CASE WHEN OBJECTPROPERTY(tr.object_id, 'ExecIsUpdateTrigger') = 1 THEN 'UPDATE ' ELSE '' END +
|
|
361
|
+
CASE WHEN OBJECTPROPERTY(tr.object_id, 'ExecIsDeleteTrigger') = 1 THEN 'DELETE' ELSE '' END as trigger_events,
|
|
362
|
+
tr.create_date,
|
|
363
|
+
tr.modify_date
|
|
364
|
+
${args.includeDefinition ? ', OBJECT_DEFINITION(tr.object_id) as definition' : ''}
|
|
365
|
+
FROM sys.triggers tr
|
|
366
|
+
WHERE tr.parent_class = 1 -- Object triggers only
|
|
367
|
+
${tableFilter}
|
|
368
|
+
ORDER BY schema_name, table_name, trigger_name
|
|
369
|
+
`;
|
|
370
|
+
return await client.query(query, undefined, args.server);
|
|
371
|
+
},
|
|
372
|
+
},
|
|
373
|
+
};
|
|
374
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED