---
name: kd-ksql
description: 金蝶 Cosmic 体系 KSQL/SQL 数据修复脚本生成、审查和验证技能。适用于数据修复、批量更新、字段回填、影响范围查询、备份、回滚、元数据确认表字段映射、SQL lint 证据等金蝶AI苍穹、金蝶AI星瀚、金蝶AI套件场景。默认生成 PostgreSQL 语法，推荐生成前通过只读连库 查 FKERNELXML/fdata 验证表名和字段名，不生成 Java。
---

# 金蝶 KSQL 数据修复

本技能用于 Cosmic 体系 SQL/KSQL 数据修复工作。它产出数据库脚本，不生成 Java 插件代码。

不要把本技能用于 Enterprise C# 技术栈假设或非 Cosmic 表结构映射。

## 适用产品线

- 适用：基于 Cosmic/BOS 元数据与 KSQL/SQL 数据修复场景的金蝶AI苍穹、金蝶AI星瀚、金蝶AI套件项目。
- 条件适用：企业版数据修复建议先确认数据库、表结构和交付规范，不宜直接套用 Cosmic KSQL 规则。

## 路径约定

- `<SKILL_ROOT>` = 当前 `SKILL.md` 所在目录（即 `skills/kd-ksql/`）
- SQL 静态检查用 KCode `review`（喂 `kd-ksql-rules` + `kd-coding-standards` 规则）或人工审查。

## 必读规则

处理任何 KSQL/SQL 数据修复请求时，建议先完整读取 [references/ksql-datafix.md](references/ksql-datafix.md)，并按其中"确认卡片"模板输出。

## 前置条件

生成最终 SQL 前：

- 确认产品属于 Cosmic 体系。
- 用 KCode `bash` 跑 `mvn validate -DdryRun=true` 做配置预检，或使用已有成功配置证据。
- 用**只读连库 SQL** 查 `T_META_OBJECTTYPE.FKERNELXML`/`t_meta_entitydesign.fdata` 并解析（见 `skills/_shared/metadata-db-query.md`），或 KCode `search` 验证表单 ID、单据名称、表名、字段数据库名、字段类型、枚举/下拉值、基础资料落库字段、`dbKey` 和 `dbName`。

- 表、字段、枚举或数据库路由事实未验证时，停止并列出待确认项。
- 多张表的 `dbName` 不一致时，不生成普通跨库更新 SQL；先让用户确认跨库处理策略。

## 辅助工具

- 最终 SQL 文件生成后，用 KCode `review`（喂 `kd-ksql-rules` + `kd-coding-standards` 规则）做静态检查，或人工审查高风险项。
- 若检查发现 `ERROR` 级问题，推荐优先修复 SQL 后再交付；`WARN` 级问题建议按偏好修复或在结果中说明保留原因。
- 高风险项检查清单：无 `WHERE` 的 `UPDATE/DELETE`、非备份场景 `SELECT *`、备份语句/备份表命名、时间戳一致性、`EXISTS` 偏好、`NULL` 判断和 PostgreSQL 多表更新风格。

## 工作流硬约束

1. 先拆解自然语言意图，明确目标对象、操作类型、目标字段、条件字段、新值来源和风险边界。
2. 推荐**只读连库**查 FKERNELXML/fdata（`metadata-db-query.md`）确认每个单据的表名和每个数据库字段名；建议对用户给的中英文标识都进行核对。

3. 编写 SQL 前推荐先判断所有参与表的 `dbName` 是否一致；一致时按单库 SQL 处理，不一致时进入分库/跨库场景。
4. 分库/跨库场景建议避免直接生成普通更新 SQL；推荐先让用户确认 dblink / postgres_fdw / 导出导入临时表等处理方式。
5. 所有表名、`dbKey`、`dbName`、枚举值、状态值、基础资料落库字段全部确认后，才允许生成最终 KSQL。
6. 任一字段、表名或 `dbName` 未确认时，只输出待确认项，不生成最终 KSQL。
7. 推荐在每条 `update` 前编写对应的查询语句，查询条件和关联范围建议与 `update` 保持一致。
8. 备份操作推荐使用 `select * into` 进行整表备份，备份语句不加 `where`，备份表名推荐以 `bak_` 开头，以当前生成时间 `yyyyMMddHHmm` 结尾。
9. 查询/验证语句推荐避免使用 `select *`；备份语句例外。
10. 推荐避免编写无 `where` 条件的 `update` / `delete`。
11. 单据主键一般是 `fid`；分录表主键一般是 `fentryid`；分录表一般通过 `fid` 与单据主表关联。
12. 本 Skill 只生成数据库执行脚本，不生成 Java 插件代码。
13. 所有确认卡片均为 [通过] 后，最终在用户桌面生成 SQL 文本文件；任一卡片为 [未通过] 时，不生成文件。
14. 默认使用 PostgreSQL 语法生成 SQL；除非用户明确指定其他数据库方言，否则不要输出其他方言写法。
15. SQL 可读性偏好：成员关系/半连接条件默认使用 `IN`（值列表或子查询），避免使用 `EXISTS`；只有 `IN` 会改变语义或无法表达时才保留 `EXISTS`，并说明原因。
16. 最终 SQL 文件生成后建议使用 KCode `review` 进行静态检查；如因环境限制无法运行，可在最终回复中说明原因。

## 确认卡片

最终 SQL 前提供确认卡片：

```text
意图：<业务目标>
产品：<Cosmic 体系产品>
对象：<表单/单据/基础资料>
元数据：已确认 / 待确认
表：已确认 / 待确认
字段：已确认 / 待确认
数据库路由：单库 / 跨库 / 待确认
影响范围查询：已确认 / 待确认
备份：已确认 / 待确认
更新：已确认 / 待确认
验证：已确认 / 待确认
回滚：已确认 / 待确认
Lint：已通过 / 待执行
```

只有所有必需项都已确认，才生成最终 SQL。

## 脚本结构

最终 SQL 应包含：

1. 文件头：目的、产品、元数据来源、时间戳和执行提醒。
2. 影响范围查询。
3. 整表备份：`SELECT * INTO bak_<table>_<yyyyMMddHHmm>`。
4. 与更新范围一致的更新前确认查询。
5. 正式更新语句。
6. 更新后验证查询。
7. 回滚语句。
8. 来自元数据证据的字段映射摘要。

## 安全规则

- 不生成无 `WHERE` 的 `UPDATE` 或 `DELETE`。
- 除整表备份外，不使用 `SELECT *`。
- 影响范围、更新前检查、更新、验证和回滚的范围保持一致。
- 语义等价时优先使用可读的 `IN` 成员条件。
- 空值判断使用 `IS NULL` 和 `IS NOT NULL`。
- 避免 drop、rename 等破坏性结构变更；除非用户明确要求并记录风险。
- 数据更新前先做整表备份。
- 备份表名和输出文件名使用同一个时间戳。

## 桌面文件产物

- 路径：`~/Desktop/ksql_<业务缩写>_<当前生成时间yyyyMMddHHmm>.txt`
- 内容：完整 SQL 执行脚本，至少包含影响范围查询、整表备份、更新前确认查询、正式执行语句、执行后验证语句和回滚语句。
- 时间：文件名里的时间戳建议取当前生成时间，与备份表名时间戳保持一致。
- 风格：SQL 文件使用 `-- ============================================` 分隔章节；文件开头写业务标题、关键条件和执行前提醒；SQL 关键字大写；文件末尾补充"字段映射（来自元数据）"。
- 阻断机制：待确认项非空、任一确认卡片为 [未通过] 时，避免创建桌面文件。
- 检查：文件生成后用 KCode `review` 做静态检查，无 P0 后再交付。

## 审查和证据

创建 SQL 文件后：

- 对文件运行 KCode `review`（喂 `kd-ksql-rules` + `kd-coding-standards` 规则）做静态检查。
- 交付前推荐优先修复审查发现的 `ERROR`。
- 对剩余 `WARN` 说明保留原因。
- 审查结果在回复中说明；没有自动 evidence 机制时，把审查结论写进交付说明。

## 输出要求

交付时说明：

- SQL 文件路径。
- 使用的元数据来源。
- lint 状态。
- 执行前还需要人工确认的事项。
