---
date: 2026-05-07
tags: [seed, prisma, performance, hr]
---

# Seed 链的两个隐藏坑

## 1. `performance-seed.ts` 与 `performance-basic-seed.ts` 完全重复

`backend/prisma/seeds/performance-seed.ts` 和 `performance-basic-seed.ts` 内容**完全一致**（仅文件头注释里的执行命令不同，79 行 / 79 行）。两者都导出 `seedPerformance` 并都注册了 `if (require.main === module)`。

主入口 `prisma/seed.ts` 没引用任何一个，只能单独跑。同时维护两份是僵尸冗余。

**建议**：删除 `performance-seed.ts`，保留 `performance-basic-seed.ts`（命名更准确），并把它加到 `prisma/seed.ts` 主入口。

## 2. `performance-demo-seed.sql` 隐式依赖部门数据，但 seed 链没人种部门

`prisma/seeds/performance-demo-seed.sql` 注释里写"前置条件：需要先执行系统主种子（users/orgs/departments）"，但实际整套 seed 链（`db:seed` + 所有独立 seed）里**没有任何脚本会插入 `corp_hr.departments`**。

直接跑会报：
```
ERROR:  ❌ 组织 Test Organization 下没有部门
CONTEXT:  PL/pgSQL function inline_code_block line 75 at RAISE
```

`robot-manager-e2e-seed.ts` 创建了 Test Organization，但只造用户，没造部门。

**绕行方案**（手动 SQL）：
```sql
INSERT INTO corp_hr.departments (id, organization_id, name, code, "order", metadata, created_at, updated_at)
VALUES
  (gen_random_uuid(), '<test_org_id>', '研发中心', 'RND', 1, '{}', NOW(), NOW()),
  (gen_random_uuid(), '<test_org_id>', '产品部', 'PRD', 2, '{}', NOW(), NOW()),
  (gen_random_uuid(), '<test_org_id>', '人力资源部', 'HR', 3, '{}', NOW(), NOW()),
  (gen_random_uuid(), '<test_org_id>', '财务部', 'FIN', 4, '{}', NOW(), NOW())
ON CONFLICT DO NOTHING;
```
SQL 内部是 `LIMIT 4` 取前 4 个部门，所以至少要 4 个。

**建议**：
- 在 `robot-manager-e2e-seed.ts` 的 `ensureOrganization()` 后加一个 `ensureDepartments()`，固化前 4 个部门
- 或者在 `performance-demo-seed.sql` 顶部主动 upsert 4 个默认部门，自给自足

否则任何空库初始化流程跑到 `performance-demo` 就会断。

## 关联

- 既有 learning [2026-04-14-seed-upsert-drift.md](2026-04-14-seed-upsert-drift.md) 讲的是 upsert 漂移；本次是**前置依赖未声明**，性质不同。
