Files
akmon/doc_mall/database/database_syntax_fix_report.md
2026-01-20 08:04:15 +08:00

4.1 KiB
Raw Permalink Blame History

商城数据库语法修正报告

修正概述

本次修正主要解决了 PostgreSQL RLS (Row Level Security) 策略语法错误,确保数据库脚本可以正常执行。

主要修正内容

1. RLS 策略语法修正

问题描述: 原始 RLS 策略使用了错误的语法:

-- 错误语法
CREATE POLICY ml_products_modify_policy ON public.ml_products
    FOR INSERT, UPDATE, DELETE USING (...);

修正方案: PostgreSQL 不支持在单个策略中同时定义多个操作类型,需要分别创建:

  • SELECT 操作使用 USING 子句
  • INSERT 操作使用 WITH CHECK 子句
  • UPDATE 操作使用 USING 子句
  • DELETE 操作使用 USING 子句

修正后语法:

-- 正确语法
CREATE POLICY ml_products_select_policy ON public.ml_products
    FOR SELECT USING (status = 1);

CREATE POLICY ml_products_insert_policy ON public.ml_products
    FOR INSERT WITH CHECK (
        auth.uid()::text = (SELECT auth_id::text FROM public.ak_users WHERE id = merchant_id)
    );

CREATE POLICY ml_products_update_policy ON public.ml_products
    FOR UPDATE USING (
        auth.uid()::text = (SELECT auth_id::text FROM public.ak_users WHERE id = merchant_id)
    );

CREATE POLICY ml_products_delete_policy ON public.ml_products
    FOR DELETE USING (
        auth.uid()::text = (SELECT auth_id::text FROM public.ak_users WHERE id = merchant_id)
    );

2. 修正的数据表

以下数据表的 RLS 策略已全部修正:

  1. ml_user_profiles - 用户档案表
  2. ml_user_addresses - 用户地址表
  3. ml_shopping_cart - 购物车表
  4. ml_user_favorites - 用户收藏表
  5. ml_browse_history - 浏览历史表
  6. ml_user_coupons - 用户优惠券表
  7. ml_orders - 订单表
  8. ml_products - 商品表

3. 验证的语法正确性

以下语法已验证无误:

扩展启用语法

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_stat_statements";
CREATE EXTENSION IF NOT EXISTS "btree_gin";

UUID 生成语法

id UUID PRIMARY KEY DEFAULT uuid_generate_v4()

JSONB 数据类型

preferences JSONB DEFAULT '{}'
image_urls JSONB DEFAULT '[]'

函数定义语法

CREATE OR REPLACE FUNCTION public.update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

触发器语法

CREATE TRIGGER trigger_ml_user_profiles_updated_at
    BEFORE UPDATE ON public.ml_user_profiles
    FOR EACH ROW EXECUTE FUNCTION public.update_updated_at_column();

修正后的文件状态

文件路径: h:\blews\akmon\doc_mall\database\complete_mall_database.sql

修正前行数: 1056 行 修正后行数: 1177 行(增加了分离的 RLS 策略定义)

RLS 策略权限设计

用户数据权限

  • 原则: 用户只能访问自己的数据
  • 实现: 通过 auth.uid()ak_users.auth_id 关联验证

商品权限

  • 查看权限: 所有人可查看已上架商品status = 1
  • 管理权限: 商家只能管理自己的商品

订单权限

  • 查看权限: 用户可查看自己的订单,商家可查看自己店铺的订单
  • 实现: 同时检查 user_idmerchant_id

数据库兼容性

PostgreSQL 兼容

  • 使用标准 PostgreSQL 语法
  • 支持 JSONB 数据类型
  • 使用 uuid-ossp 扩展

Supabase 兼容

  • 支持 Row Level Security
  • 使用 auth.uid() 进行身份验证
  • 遵循 Supabase 权限模型

部署建议

  1. 执行顺序: 按脚本中的顺序依次执行
  2. 权限检查: 确保数据库用户有创建扩展的权限
  3. 数据验证: 执行后验证 RLS 策略是否正确生效
  4. 测试建议: 在测试环境先执行完整脚本验证

修正完成状态

语法错误已修正 RLS 策略已优化
PostgreSQL 兼容性已确认 Supabase 兼容性已确认 可安全部署


修正时间: 2024年12月19日 修正文件: complete_mall_database.sql 验证状态: 语法验证通过,可进行部署测试