mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-17 02:42:06 +08:00
- SQL Server 对象定义改为通过 sys.all_sql_modules 按库、schema、对象名精确查询 - 增加 sp_helptext 兼容候选,支持拼接多行 Text 返回完整定义 - 统一修复视图、函数/存储过程、触发器定义查看与对象修改入口 - 补充 SQL Server 对象定义查询和组件回归测试
48 lines
2.6 KiB
TypeScript
48 lines
2.6 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { buildSqlServerObjectDefinitionQueries } from './sqlServerObjectDefinition';
|
|
|
|
describe('buildSqlServerObjectDefinitionQueries', () => {
|
|
it('builds schema-aware SQL Server routine definition queries', () => {
|
|
const queries = buildSqlServerObjectDefinitionQueries('routine', 'dbo.p_get_select', 'BizDB', 'routine_definition');
|
|
|
|
expect(queries).toHaveLength(2);
|
|
expect(queries[0]).toContain('FROM [BizDB].sys.all_sql_modules AS m');
|
|
expect(queries[0]).toContain('JOIN [BizDB].sys.all_objects AS o ON o.object_id = m.object_id');
|
|
expect(queries[0]).toContain("WHERE o.name = N'p_get_select'");
|
|
expect(queries[0]).toContain("AND s.name = N'dbo'");
|
|
expect(queries[0]).toContain("o.type IN ('P', 'PC', 'RF', 'FN', 'FS', 'FT', 'IF', 'TF')");
|
|
expect(queries[0]).not.toContain('OBJECT_DEFINITION');
|
|
expect(queries[1]).toBe("EXEC [BizDB].sys.sp_helptext @objname = N'[dbo].[p_get_select]'");
|
|
});
|
|
|
|
it('uses the database segment from a three-part SQL Server object name', () => {
|
|
const queries = buildSqlServerObjectDefinitionQueries('view', 'Archive.reporting.active_users', 'BizDB', 'view_definition');
|
|
|
|
expect(queries[0]).toContain('FROM [Archive].sys.all_sql_modules AS m');
|
|
expect(queries[0]).toContain("WHERE o.name = N'active_users'");
|
|
expect(queries[0]).toContain("AND s.name = N'reporting'");
|
|
expect(queries[0]).toContain("o.type IN ('V')");
|
|
expect(queries[1]).toBe("EXEC [Archive].sys.sp_helptext @objname = N'[reporting].[active_users]'");
|
|
});
|
|
|
|
it('falls back to all schemas when SQL Server object name is unqualified', () => {
|
|
const queries = buildSqlServerObjectDefinitionQueries('routine', 'sp_helptext', 'master', 'routine_definition');
|
|
|
|
expect(queries[0]).toContain('FROM [master].sys.all_sql_modules AS m');
|
|
expect(queries[0]).toContain("WHERE o.name = N'sp_helptext'");
|
|
expect(queries[0]).not.toContain('AND s.name = N');
|
|
expect(queries[0]).toContain("CASE WHEN s.name = N'dbo' THEN 0 WHEN s.name = N'sys' THEN 1 ELSE 2 END");
|
|
expect(queries[1]).toBe("EXEC [master].sys.sp_helptext @objname = N'sp_helptext'");
|
|
});
|
|
|
|
it('escapes SQL Server literals and bracket identifiers', () => {
|
|
const queries = buildSqlServerObjectDefinitionQueries('trigger', "audit]x.o'clock", 'Biz]DB', 'trigger_definition');
|
|
|
|
expect(queries[0]).toContain('FROM [Biz]]DB].sys.all_sql_modules AS m');
|
|
expect(queries[0]).toContain("WHERE o.name = N'o''clock'");
|
|
expect(queries[0]).toContain("AND s.name = N'audit]x'");
|
|
expect(queries[1]).toBe("EXEC [Biz]]DB].sys.sp_helptext @objname = N'[audit]]x].[o''clock]'");
|
|
});
|
|
});
|