mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-01 13:31:24 +08:00
🐛 fix(table-designer): 优化表设计触发器修改入口
- 修改触发器从固定弹窗改为对象编辑 SQL 标签页 - 生成删除旧触发器和创建新触发器脚本,便于执行前审查 - 抽出触发器编辑 SQL 构造工具,统一 TriggerViewer 与 TableDesigner 逻辑 - 保留新增触发器原弹窗路径,降低行为变更范围 - 新增触发器编辑入口与 SQL 构造回归测试 Refs #557
This commit is contained in:
19
frontend/src/utils/triggerEditSql.test.ts
Normal file
19
frontend/src/utils/triggerEditSql.test.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { buildEditableTriggerSql } from './triggerEditSql';
|
||||
|
||||
describe('triggerEditSql', () => {
|
||||
it('builds a replace-style trigger edit script with drop and create statements', () => {
|
||||
const sql = buildEditableTriggerSql(
|
||||
'bit_check',
|
||||
'CREATE TRIGGER `bit_check`\nBEFORE INSERT ON `c_check`\nFOR EACH ROW\nBEGIN\n SET NEW.flag = 1;\nEND',
|
||||
{ dropSql: 'DROP TRIGGER IF EXISTS `bit_check`' },
|
||||
);
|
||||
|
||||
expect(sql).toContain('-- 修改触发器: bit_check');
|
||||
expect(sql).toContain('表设计修改会先删除原触发器,再创建新触发器');
|
||||
expect(sql).toContain('DROP TRIGGER IF EXISTS `bit_check`;');
|
||||
expect(sql).toContain('CREATE TRIGGER `bit_check`');
|
||||
expect(sql.trim().endsWith(';')).toBe(true);
|
||||
});
|
||||
});
|
||||
53
frontend/src/utils/triggerEditSql.ts
Normal file
53
frontend/src/utils/triggerEditSql.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
export const ensureSqlStatementTerminator = (sql: string): string => {
|
||||
const normalized = String(sql || '').trim();
|
||||
if (!normalized) return '';
|
||||
return /;\s*$/.test(normalized) ? normalized : `${normalized};`;
|
||||
};
|
||||
|
||||
const buildTriggerEditHeader = (
|
||||
triggerName: string,
|
||||
options?: { dropSql?: string },
|
||||
): string => {
|
||||
const normalizedName = String(triggerName || '').trim();
|
||||
const hint = String(options?.dropSql || '').trim()
|
||||
? '表设计修改会先删除原触发器,再创建新触发器,请确认后执行'
|
||||
: '请确认语法兼容当前数据库后执行';
|
||||
return `-- 修改触发器: ${normalizedName}\n-- ${hint}\n`;
|
||||
};
|
||||
|
||||
const normalizeEditableTriggerDefinition = (
|
||||
triggerName: string,
|
||||
triggerDefinition: string,
|
||||
): string => {
|
||||
const normalizedName = String(triggerName || '').trim();
|
||||
const normalizedDefinition = String(triggerDefinition || '').trim();
|
||||
if (!normalizedDefinition) {
|
||||
return '-- 当前触发器定义为空,请补全 CREATE TRIGGER 语句后执行';
|
||||
}
|
||||
if (/^\s*create\s+(?:or\s+replace\s+)?trigger\b/i.test(normalizedDefinition)) {
|
||||
return ensureSqlStatementTerminator(normalizedDefinition);
|
||||
}
|
||||
if (/^\s*trigger\b/i.test(normalizedDefinition)) {
|
||||
return ensureSqlStatementTerminator(
|
||||
normalizedDefinition.replace(/^\s*trigger\b/i, 'CREATE OR REPLACE TRIGGER'),
|
||||
);
|
||||
}
|
||||
if (/^\s*(?:before|after|instead\s+of)\b/i.test(normalizedDefinition)) {
|
||||
return ensureSqlStatementTerminator(`CREATE OR REPLACE TRIGGER ${normalizedName}\n${normalizedDefinition}`);
|
||||
}
|
||||
return `-- 当前数据源仅返回触发器定义片段,请补全 CREATE TRIGGER 语句后执行\n${ensureSqlStatementTerminator(normalizedDefinition)}`;
|
||||
};
|
||||
|
||||
export const buildEditableTriggerSql = (
|
||||
triggerName: string,
|
||||
triggerDefinition: string,
|
||||
options?: { dropSql?: string },
|
||||
): string => {
|
||||
const header = buildTriggerEditHeader(triggerName, options);
|
||||
const dropSql = String(options?.dropSql || '').trim();
|
||||
const createSql = normalizeEditableTriggerDefinition(triggerName, triggerDefinition);
|
||||
if (!dropSql) {
|
||||
return `${header}${createSql}`;
|
||||
}
|
||||
return `${header}${ensureSqlStatementTerminator(dropSql)}\n${createSql}`;
|
||||
};
|
||||
Reference in New Issue
Block a user