# 商城系统数据库增量升级指南 本目录包含多个数据库升级脚本,适用于不同的部署场景。请根据您的实际情况选择合适的脚本执行。 ## 🔧 最新修复 ### PL/pgSQL 变量冲突修复 **2024年最新修复:mock_data_insert.sql 中的变量命名冲突和空值问题** 在 `mock_data_insert.sql` 中修复了三个重要问题: 1. **变量命名冲突**:将订单生成部分的变量 `merchant_id` 重命名为 `selected_merchant_id` 2. **订单商品价格空值**:使用 COALESCE 函数处理SKU价格为空的情况,确保价格字段不为空 3. **配送任务重复**:使用 DISTINCT ON 和 NOT EXISTS 确保每个订单只创建一个配送任务 修复的错误类型: - `ERROR: 42702: column reference "merchant_id" is ambiguous` - `ERROR: 23502: null value in column "price" violates not-null constraint` - `ERROR: 23505: duplicate key value violates unique constraint "ml_delivery_tasks_order_id_key"` 详细信息请查看 `VARIABLE_CONFLICT_FIX_REPORT.md` ### 验证脚本 运行 `verify_mock_data_fix.sql` 可以验证修复效果和数据完整性 ## ⚠️ 重要:角色字段统一升级 **版本更新:用户角色字段已从 `user_type` (INTEGER) 统一为 `role` (TEXT)** 为提高代码可读性和语义清晰度,我们将所有用户角色相关字段统一为 `role` 字段: - `ak_users.role` - TEXT 类型,值:'admin', 'merchant', 'customer', 'delivery', 'service' - `ml_user_profiles.role` - TEXT 类型,值:'admin', 'merchant', 'customer', 'delivery', 'service' ### 角色字段快速迁移 如果您的数据库中仍有 `user_type` 字段,请运行以下脚本进行迁移: ```bash psql -f quick_role_migration.sql ``` 该脚本会: 1. 安全地添加 `role` 字段 2. 将现有 `user_type` 数据迁移到 `role` 字段 3. 更新相关约束、索引、函数和视图 4. 同步 `ak_users` 和 `ml_user_profiles` 的角色字段 ## 🔐 重要:Supabase Auth 用户创建 **在执行任何数据库升级之前,必须先创建 Supabase Auth 用户!** ### 第一步:创建 Supabase Auth 用户 #### 方法一:自动化脚本(推荐) ```bash # 1. 安装依赖 npm install @supabase/supabase-js # 2. 设置环境变量 export SUPABASE_URL="https://your-project.supabase.co" export SUPABASE_SERVICE_ROLE_KEY="your-service-role-key" # 3. 运行创建脚本 node create_supabase_auth_users.js ``` #### 方法二:Supabase Dashboard 手动创建 在 Dashboard → Authentication → Users 中创建以下测试用户: - admin@mall.com (密码: Test123456!) - merchant1@mall.com (密码: Test123456!) - merchant2@mall.com (密码: Test123456!) - customer1@mall.com (密码: Test123456!) - customer2@mall.com (密码: Test123456!) - customer3@mall.com (密码: Test123456!) - driver1@mall.com (密码: Test123456!) - driver2@mall.com (密码: Test123456!) #### 验证用户创建 ```sql \i create_supabase_auth_users.sql ``` ## �📋 脚本清单 ### 🔍 检查脚本 - **`mall_database_check.sql`** - 数据库状态检查脚本 - 分析现有数据库结构 - 检查缺失的表、字段、索引 - 生成个性化升级建议 ### 🚀 升级脚本 - **`mall_alter_upgrade.sql`** - 完整增量升级脚本 - 创建商城核心表(如果不存在) - 为 ak_users 表添加商城字段 - 创建索引、触发器、函数 - 插入基础配置数据 - **`mall_fields_only_upgrade.sql`** - 仅字段升级脚本 - 专门为已有表添加缺失字段 - 添加CID自增字段(SEO优化) - 创建相应索引和约束 - 最小化修改,适用于生产环境 ### 🔄 迁移脚本 - **`quick_role_migration.sql`** - 角色字段快速迁移脚本 - 将 `user_type` 字段安全迁移为 `role` 字段 - 更新相关约束、索引、函数和视图 - 包含完整的回滚方案 - **`role_field_unification.sql`** - 角色字段统一升级脚本(完整版) - 全面的角色字段统一方案 - 创建角色管理相关的辅助函数 - 数据一致性检查和修复 ### 👥 用户和数据脚本 - **`create_supabase_auth_users.sql`** - Supabase Auth 用户检查脚本 - 检测Supabase环境 - 提供用户创建指导 - 验证Auth用户状态 - **`create_supabase_auth_users.js`** - Node.js 用户批量创建脚本 - 使用 Admin API 自动创建测试用户 - 自动处理已存在用户 - 详细日志输出 - **`create_supabase_auth_users.js`** - Node.js 用户创建脚本 - 使用Admin API批量创建测试用户 - 自动处理重复用户 - 详细的执行日志 - **`mock_data_insert.sql`** - 模拟数据插入脚本 ## 🎯 使用场景选择 ### 场景一:Supabase 环境全新部署 ```bash # Supabase 环境完整部署流程 1. create_supabase_auth_users.js # (推荐) 使用Admin API创建Auth用户 # 或 create_supabase_auth_users.sql # 检查并指导创建Auth用户 2. mall_migration.sql # 创建所有表和结构 3. mall_seo_security.sql # SEO优化和安全策略 4. mock_data_insert.sql # (可选) 插入测试数据 ``` ### 场景二:现有数据库 + 缺少商城表 ```bash # 如果已有 ak_users 但缺少商城表 1. create_supabase_auth_users.js # (Supabase环境) 创建Auth用户 2. mall_database_check.sql # 检查数据库状态 3. mall_alter_upgrade.sql # 增量升级(推荐) 4. mall_seo_security.sql # SEO优化和安全策略 ``` ### 场景三:已有商城表 + 缺少字段/CID ```bash # 如果已有商城表但缺少某些字段或CID 1. create_supabase_auth_users.js # (Supabase环境) 确保Auth用户存在 2. mall_database_check.sql # 检查数据库状态 3. mall_fields_only_upgrade.sql # 仅添加字段和CID(推荐) ``` ### 场景四:非Supabase环境 ```bash # 如果使用标准PostgreSQL 1. mall_database_check.sql # 检查数据库状态 2. mall_alter_upgrade.sql # 或 mall_fields_only_upgrade.sql 3. mall_seo_security.sql # SEO优化和安全策略 4. mock_data_insert.sql # 模拟数据(会创建虚拟auth_id) ``` ## 📖 详细使用步骤 ### 🔐 第零步:创建Supabase Auth用户(Supabase环境必需) 如果您使用Supabase,必须先创建Auth用户,否则业务数据无法正确关联。 #### 方法一:使用Node.js脚本(推荐) ```bash # 1. 安装依赖 npm install @supabase/supabase-js # 2. 设置环境变量 export SUPABASE_URL=https://your-project.supabase.co export SUPABASE_SERVICE_ROLE_KEY=your-service-role-key # 3. 运行脚本 node create_supabase_auth_users.js ``` #### 方法二:使用Supabase Dashboard ```bash # 1. 登录 https://supabase.com/dashboard # 2. 进入您的项目 -> Authentication -> Users # 3. 点击 "Add user" 创建以下测试用户: 测试用户列表(密码统一:Test123456!): 📧 admin@mall.com (角色: 管理员) 📧 merchant1@mall.com (角色: 商家) 📧 merchant2@mall.com (角色: 商家) 📧 customer1@mall.com (角色: 消费者) 📧 customer2@mall.com (角色: 消费者) 📧 customer3@mall.com (角色: 消费者) 📧 driver1@mall.com (角色: 配送员) 📧 driver2@mall.com (角色: 配送员) ``` #### 方法三:SQL检查脚本 ```sql -- 检查环境并获得创建指导 \i create_supabase_auth_users.sql ``` ### 第一步:检查数据库状态 ```sql -- 在数据库中执行检查脚本 \i mall_database_check.sql ``` ### 第二步:根据检查结果选择脚本 检查脚本会输出类似以下建议: ``` 根据您的数据库状态分析: • ak_users 表缺失字段数: 3 • 缺失商城核心表数: 5 推荐执行方案: 建议使用 mall_alter_upgrade.sql(完整升级脚本) ``` ### 第三步:执行升级脚本 ```sql -- 根据建议执行相应脚本 \i mall_alter_upgrade.sql -- 或 \i mall_fields_only_upgrade.sql ``` ### 第四步:执行SEO优化(可选) ```sql \i mall_seo_security.sql ``` ## 🔧 脚本特性 ### 安全特性 - ✅ 使用 `IF NOT EXISTS` 检查,避免重复创建 - ✅ 使用 `DO $$ ... END $$` 块进行条件检查 - ✅ 详细的日志输出,便于跟踪执行过程 - ✅ 事务安全,出错时自动回滚 ### 兼容性 - ✅ PostgreSQL 12+ - ✅ Supabase 完全兼容 - ✅ 保持与现有数据的兼容性 - ✅ 复用 ak_users 表,新表使用 ml_ 前缀 ## 📝 字段说明 ### ak_users 表新增字段 | 字段名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `mall_status` | INTEGER | 1 | 商城状态 (1:正常 2:禁用) | | `mall_type` | INTEGER | 1 | 用户类型 (1:消费者 2:商家 3:其他) | | `total_orders` | INTEGER | 0 | 总订单数 | | `total_spent` | DECIMAL | 0.00 | 总消费金额 | | `user_level` | INTEGER | 1 | 用户等级 (1-10) | | `points` | INTEGER | 0 | 用户积分 | | `verified_status` | INTEGER | 0 | 认证状态 (0:未认证 1:已认证 2:失败) | ### 商城核心表 | 表名 | 说明 | CID字段 | |------|------|---------| | `ml_user_profiles` | 用户扩展信息 | ❌ | | `ml_categories` | 商品分类 | ✅ | | `ml_brands` | 品牌 | ✅ | | `ml_products` | 商品 | ✅ | | `ml_shops` | 店铺 | ✅ | | `ml_orders` | 订单 | ✅ | ## ⚠️ 注意事项 ### 执行前准备 1. **备份数据库** - 在生产环境执行前务必备份 2. **测试环境验证** - 先在测试环境执行和验证 3. **检查权限** - 确保有足够的数据库权限 4. **停止应用** - 执行期间建议停止相关应用 ### 生产环境建议 1. **分步执行** - 可以分多次执行,每次执行一个脚本 2. **监控日志** - 注意观察执行过程中的日志输出 3. **验证结果** - 执行后检查表结构和数据完整性 4. **回滚准备** - 准备回滚方案以防出现问题 ## 🔄 回滚方案 如果需要回滚,可以执行以下操作: ```sql -- 删除新增字段(谨慎操作) ALTER TABLE public.ak_users DROP COLUMN IF EXISTS mall_status; ALTER TABLE public.ak_users DROP COLUMN IF EXISTS mall_type; -- ... 其他字段 -- 删除新建表(谨慎操作) DROP TABLE IF EXISTS public.ml_shopping_cart CASCADE; DROP TABLE IF EXISTS public.ml_orders CASCADE; -- ... 其他表(注意依赖关系) ``` ## � Supabase Auth 用户创建详细说明 ### 为什么需要先创建 Auth 用户? 在 Supabase 环境中,`ak_users.auth_id` 字段需要关联真实的 `auth.users.id`。如果 Auth 用户不存在,模拟数据脚本会创建虚拟 UUID,导致用户无法正常登录。 ### 创建方式对比 | 方式 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | Node.js 脚本 | 自动化,批量处理,错误处理完善 | 需要配置环境变量 | 开发环境,批量创建 | | Dashboard 手动 | 直观,不需要代码 | 手动操作,容易出错 | 少量用户,生产环境 | | Admin API | 灵活,可集成到应用 | 需要编程实现 | 自定义集成 | ### 环境变量配置 创建 `.env` 文件或设置系统环境变量: ```bash # Supabase 项目 URL SUPABASE_URL=https://your-project-id.supabase.co # Service Role Key (在 Dashboard > Settings > API 中找到) SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` ### 验证 Auth 用户创建成功 ```sql -- 查看所有测试用户 SELECT id, email, email_confirmed_at IS NOT NULL as confirmed, created_at, user_metadata FROM auth.users WHERE email LIKE '%@mall.com' ORDER BY email; -- 检查 ak_users 关联状态 SELECT u.email, u.nickname, u.user_type, CASE WHEN au.id IS NOT NULL THEN '✓ 已关联' ELSE '✗ 未关联' END as auth_status FROM ak_users u LEFT JOIN auth.users au ON u.auth_id = au.id WHERE u.email LIKE '%@mall.com' ORDER BY u.email; ``` ### 常见问题解决 #### 1. Service Role Key 权限不足 确保使用的是 Service Role Key,不是 anon key。 #### 2. 用户已存在错误 脚本会自动处理已存在的用户,不会重复创建。 #### 3. 邮箱验证问题 脚本设置 `email_confirm: true`,自动验证邮箱。 #### 4. 密码策略不符合要求 默认密码 `Test123456!` 符合大多数密码策略,如需修改请在脚本中调整。 ## 🔧 故障排除 ### Auth 用户创建失败 ```bash # 检查网络连接 curl -I https://your-project.supabase.co # 验证 API Key curl -H "Authorization: Bearer $SUPABASE_SERVICE_ROLE_KEY" \ https://your-project.supabase.co/auth/v1/admin/users # 重新运行创建脚本 node create_supabase_auth_users.js ``` ## �📞 技术支持 如遇问题,请: 1. 检查数据库日志 2. 确认PostgreSQL版本兼容性 3. 验证执行权限 4. 查看详细错误信息 5. 确保 Supabase Auth 用户已正确创建 --- **最后更新:** 2024年12月 **版本:** v1.1 **兼容性:** PostgreSQL 12+, Supabase **新增:** Supabase Auth 用户创建流程