mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-19 11:51:50 +08:00
🐛 fix(sqlserver): 修复对象 SQL 定义获取失败
- SQL Server 对象定义改为通过 sys.all_sql_modules 按库、schema、对象名精确查询 - 增加 sp_helptext 兼容候选,支持拼接多行 Text 返回完整定义 - 统一修复视图、函数/存储过程、触发器定义查看与对象修改入口 - 补充 SQL Server 对象定义查询和组件回归测试
This commit is contained in:
47
frontend/src/utils/sqlServerObjectDefinition.test.ts
Normal file
47
frontend/src/utils/sqlServerObjectDefinition.test.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
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]'");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user