Initial commit of akmon project
This commit is contained in:
153
doc_mall/database/database_syntax_fix_report.md
Normal file
153
doc_mall/database/database_syntax_fix_report.md
Normal file
@@ -0,0 +1,153 @@
|
||||
# 商城数据库语法修正报告
|
||||
|
||||
## 修正概述
|
||||
|
||||
本次修正主要解决了 PostgreSQL RLS (Row Level Security) 策略语法错误,确保数据库脚本可以正常执行。
|
||||
|
||||
## 主要修正内容
|
||||
|
||||
### 1. RLS 策略语法修正
|
||||
|
||||
**问题描述:**
|
||||
原始 RLS 策略使用了错误的语法:
|
||||
```sql
|
||||
-- 错误语法
|
||||
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` 子句
|
||||
|
||||
**修正后语法:**
|
||||
```sql
|
||||
-- 正确语法
|
||||
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. 验证的语法正确性
|
||||
|
||||
以下语法已验证无误:
|
||||
|
||||
✅ **扩展启用语法**
|
||||
```sql
|
||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
CREATE EXTENSION IF NOT EXISTS "pg_stat_statements";
|
||||
CREATE EXTENSION IF NOT EXISTS "btree_gin";
|
||||
```
|
||||
|
||||
✅ **UUID 生成语法**
|
||||
```sql
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4()
|
||||
```
|
||||
|
||||
✅ **JSONB 数据类型**
|
||||
```sql
|
||||
preferences JSONB DEFAULT '{}'
|
||||
image_urls JSONB DEFAULT '[]'
|
||||
```
|
||||
|
||||
✅ **函数定义语法**
|
||||
```sql
|
||||
CREATE OR REPLACE FUNCTION public.update_updated_at_column()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
```
|
||||
|
||||
✅ **触发器语法**
|
||||
```sql
|
||||
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 权限模型
|
||||
|
||||
## 部署建议
|
||||
|
||||
1. **执行顺序:** 按脚本中的顺序依次执行
|
||||
2. **权限检查:** 确保数据库用户有创建扩展的权限
|
||||
3. **数据验证:** 执行后验证 RLS 策略是否正确生效
|
||||
4. **测试建议:** 在测试环境先执行完整脚本验证
|
||||
|
||||
## 修正完成状态
|
||||
|
||||
✅ **语法错误已修正**
|
||||
✅ **RLS 策略已优化**
|
||||
✅ **PostgreSQL 兼容性已确认**
|
||||
✅ **Supabase 兼容性已确认**
|
||||
✅ **可安全部署**
|
||||
|
||||
---
|
||||
|
||||
**修正时间:** 2024年12月19日
|
||||
**修正文件:** complete_mall_database.sql
|
||||
**验证状态:** 语法验证通过,可进行部署测试
|
||||
Reference in New Issue
Block a user