Files
MyGoNavi/frontend/src/utils/triggerEditSql.ts
Syngnat ae2b27c4b4 🐛 fix(table-designer): 优化表设计触发器修改入口
- 修改触发器从固定弹窗改为对象编辑 SQL 标签页
- 生成删除旧触发器和创建新触发器脚本,便于执行前审查
- 抽出触发器编辑 SQL 构造工具,统一 TriggerViewer 与 TableDesigner 逻辑
- 保留新增触发器原弹窗路径,降低行为变更范围
- 新增触发器编辑入口与 SQL 构造回归测试
Refs #557
2026-06-12 17:39:34 +08:00

54 lines
2.1 KiB
TypeScript

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}`;
};