55 lines
1.6 KiB
Markdown
55 lines
1.6 KiB
Markdown
# 12.6 数据删除规范
|
|
|
|
:::tip 建议遵守
|
|
删除的默认形态是软删除;物理删除是受控例外。删除前做引用守卫,删除后可追溯。
|
|
:::
|
|
|
|
## 默认:软删除
|
|
|
|
```go
|
|
// repository 标准入口
|
|
repo.SoftDelete(ctx, "id", id)
|
|
repo.SoftDeleteByID(ctx, id)
|
|
|
|
// 批量:基座 BatchDelete(逐条软删)
|
|
spec.BatchDelete(ctx, ids)
|
|
```
|
|
|
|
软删后对查询不可见(Ctx 注入 del_flag=0),数据保留可审计、可恢复(运维按需 UPDATE 回 0)。
|
|
|
|
## 例外:物理删除
|
|
|
|
仅限**数据本身有保留期语义**的场景(超期日志、临时文件索引):
|
|
|
|
```go
|
|
ctx = hooks.WithPhysicalDelete(ctx) // 显式放行
|
|
```
|
|
|
|
放行要收敛在最小函数作用域,注释说明依据(如"超过 job.logRetentionDays")。
|
|
|
|
## 删除守卫
|
|
|
|
删除被引用数据前做存在性检查,冲突时上抛守卫错误:
|
|
|
|
| 错误码 | 场景 |
|
|
|---|---|
|
|
| CodeHasChildren | 树形表存在下级(部门/菜单/分类) |
|
|
| CodeInUse | 关键记录仍被引用(用户在角色中等) |
|
|
|
|
守卫检查用 `ExistsByCond`(软删/租户已过滤)。
|
|
|
|
## 前端交互
|
|
|
|
- 危险删除(批量、不可逆)必须二次确认
|
|
- 删除失败展示后端 msg(守卫原因)
|
|
- 不做"假删除"(前端移除行但不调接口)
|
|
|
|
## 审计要求
|
|
|
|
删除操作经 RouteSpec Log/LogType=delete 留操作日志——谁删了什么可追溯。物理删除场景本身不落业务表,但任务日志留有执行记录。
|
|
|
|
## 相关
|
|
|
|
- [12.3 数据访问铁律](/zh/standards/data-access.html)
|
|
- [4.8 横切机制](/zh/architecture/cross-cutting.html)
|