4.1 KiB
4.1 KiB
商城数据库语法修正报告
修正概述
本次修正主要解决了 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 策略已全部修正:
- ml_user_profiles - 用户档案表
- ml_user_addresses - 用户地址表
- ml_shopping_cart - 购物车表
- ml_user_favorites - 用户收藏表
- ml_browse_history - 浏览历史表
- ml_user_coupons - 用户优惠券表
- ml_orders - 订单表
- 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_id和merchant_id
数据库兼容性
✅ PostgreSQL 兼容
- 使用标准 PostgreSQL 语法
- 支持 JSONB 数据类型
- 使用 uuid-ossp 扩展
✅ Supabase 兼容
- 支持 Row Level Security
- 使用
auth.uid()进行身份验证 - 遵循 Supabase 权限模型
部署建议
- 执行顺序: 按脚本中的顺序依次执行
- 权限检查: 确保数据库用户有创建扩展的权限
- 数据验证: 执行后验证 RLS 策略是否正确生效
- 测试建议: 在测试环境先执行完整脚本验证
修正完成状态
✅ 语法错误已修正
✅ RLS 策略已优化
✅ PostgreSQL 兼容性已确认
✅ Supabase 兼容性已确认
✅ 可安全部署
修正时间: 2024年12月19日 修正文件: complete_mall_database.sql 验证状态: 语法验证通过,可进行部署测试