diff --git a/migrations/000010_v0_1_12_version.sql b/migrations/000010_v0_1_12_version.sql new file mode 100644 index 0000000..ce9bc0c --- /dev/null +++ b/migrations/000010_v0_1_12_version.sql @@ -0,0 +1,25 @@ +-- +goose Up +-- 将 tnt_users.email 由 NOT NULL 改为可空。 +-- +-- 背景:普通成员的邮箱在系统中基本用不上——成员只能用 RAM 账号(username@tenant_code) +-- 登录(admin 邮箱登录只认 role=owner 的主用户),且成员不能凭邮箱自助重置密码, +-- 邮箱仅用于邮件通知与成员列表展示。因此将邀请加入、管理员创建、CSV 导入三条 +-- 创建路径统一为「邮箱选填」,与 CreateMember / member_import 既有的选填行为对齐。 +-- +-- 顺带修复既有隐患:原 email 为 NOT NULL + UNIQUE(tenant_id, email),不填邮箱时 +-- 代码只能写入空字符串 "",而空字符串是确定值,导致同一租户下仅能存在一个空邮箱 +-- 成员,第二个会撞唯一约束报「邮箱已存在」。改为可空后,PostgreSQL 唯一索引允许 +-- 多个 NULL,多个无邮箱成员不再冲突。 +-- +-- 注意:列的可空性变更不需要重新 gf gen dao——DO 中 Email 字段本就声明为 any 类型, +-- 业务代码在 email 为空时传 nil 即可写入 SQL NULL。 + +ALTER TABLE tnt_users ALTER COLUMN email DROP NOT NULL; + +-- 将已存在的空字符串 email 归一为 NULL,避免旧空串数据继续占用唯一约束位。 +UPDATE tnt_users SET email = NULL WHERE email = ''; + +-- +goose Down +-- 恢复 NOT NULL 前需保证无 NULL email(否则 SET NOT NULL 会失败),回退为空字符串。 +UPDATE tnt_users SET email = '' WHERE email IS NULL; +ALTER TABLE tnt_users ALTER COLUMN email SET NOT NULL;