# 操作文档：修复 `ak_users` 表写入协调问题

- **日期**: 2026-02-04
- **范围**: 数据库 Schema (`public.ak_users`)
- **标题**: 修复 `auth.users` -> `ak_users` 自动同步的写入协调问题

## 摘要

本操作通过修改 `public.ak_users` 表的结构，解决了新用户在 Supabase Auth 注册后，无法在业务表 `ak_users` 中自动创建对应记录的问题。核心改动是放宽了 `username` 和 `email` 字段的 `NOT NULL` 约束。

## 动机

在当前实现中，`auth.users` 表上存在一个 `on_auth_user_created` 触发器，该触发器在有新用户注册时会调用 `handle_new_user()` 函数，尝试在 `ak_users` 表中插入一条对应的业务用户记录。然而，由于 `ak_users` 表的 `username` 和 `email` 字段被设置为 `NOT NULL` 且没有默认值，而 `handle_new_user()` 函数在执行时无法提供这两个值，导致 `INSERT` 操作因违反约束而静默失败。这造成了 `auth.users` 和 `public.ak_users` 之间的数据不一致，使得新注册的用户无法被业务系统识别，后续的权限、角色等功能全部失效。

## 影响范围

- **数据库表**: `public.ak_users`
- **数据库函数**: `public.handle_new_user()` (现在可以成功执行)
- **前端逻辑**: `utils/sapi.uts` 中的 `ensureUserProfile` 函数（现在在用户首次登录时，即使触发器失败，它也能成功插入记录）。
- **业务流程**: 新用户注册、首次登录的数据同步流程。

## 变更清单

- **新增文件**: 
  - `docs/sql/10_schema/user/ak_users_constraints_fix_v1.sql`: 包含了本次 DDL 变更的权威 SQL 脚本。
  - `docs/ops/2026-02-04__db-schema__fix-ak-users-constraints.md`: 本操作文档。

- **修改内容**: `public.ak_users` 表结构
  - `username` 字段的 `NOT NULL` 约束被移除。
  - `email` 字段的 `NOT NULL` 约束被移除。
  - `role` 字段的默认值被更新为 `'customer'`。

## 兼容性与风险

- **数据兼容性**: 此变更为向下兼容。允许 `username` 和 `email` 为空，不会影响现有记录。应用层代码（如 `ensureUserProfile`）会在用户首次登录时尝试填充这些值。
- **风险**: 理论上，现在 `ak_users` 表中可能存在 `username` 或 `email` 为空的记录。依赖这两个字段为非空的前端页面或业务逻辑需要做好空值处理，但这符合用户首次登录后才完善资料的常见模式。

## 回滚方案

如果需要撤销此变更，可以执行以下 SQL 命令，将表的约束恢复到之前的状态：

```sql
BEGIN;

ALTER TABLE public.ak_users
ALTER COLUMN username SET NOT NULL,
ALTER COLUMN email SET NOT NULL;

-- 注意：回滚前必须确保表中没有 username 或 email 为 NULL 的记录，否则会失败。

-- 将 role 的默认值恢复为 'student'（如果需要）
ALTER TABLE public.ak_users
ALTER COLUMN role SET DEFAULT 'student';

COMMIT;
```

## 验证方式

1.  **执行变更**: 在数据库中执行 `docs/sql/10_schema/user/ak_users_constraints_fix_v1.sql` 的内容。
2.  **注册新用户**: 在 App 中注册一个全新的用户（例如 `new_user@example.com`）。
3.  **验证 `ak_users` 表**: 在 SQL Editor 中查询，确认 `ak_users` 表中已自动创建了与新用户 `auth_id` 对应的记录。
    ```sql
    SELECT auth_id, email, username, role FROM public.ak_users WHERE email = 'new_user@example.com';
    ```
4.  **验证 `consistency_status`**: 再次执行之前的一致性检查 SQL，确认新用户的状态为 `CONSISTENT`。

## 关联文档

- `docs/AGENT_PROJECT_SPEC.md`
- `docs/sql/10_schema/user/ak_users_constraints_fix_v1.sql`
