You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Supabase中指定字段仅使用默认值?

解决Supabase聊天应用中消息创建日期的自定义限制问题

最优方案:通过RLS规则强制覆盖创建日期

不需要强制用户必须留空created_at字段,直接通过RLS规则忽略用户传入的任何值,由数据库自动生成正确的创建时间,这是最稳妥且用户友好的方案:

  1. 确保表字段配置正确
    先确认你的messages表中created_at字段已设置默认值为当前时间:

    ALTER TABLE messages
    ALTER COLUMN created_at SET DEFAULT now();
    

    同时建议设置该字段为非空,避免出现无时间的消息:

    ALTER TABLE messages
    ALTER COLUMN created_at SET NOT NULL;
    
  2. 修改INSERT的RLS规则,强制覆盖创建日期
    在现有的插入权限规则中添加SET (created_at = now()),这样不管用户插入时传入什么created_at值,都会被数据库替换为当前服务器时间:

    CREATE OR REPLACE POLICY "用户仅能插入自身消息" ON messages
    FOR INSERT TO authenticated
    WITH CHECK (auth.uid() = user_id)
    SET (created_at = now());
    

    这个规则既保留了原有的用户身份校验,又彻底杜绝了自定义创建日期的可能。

  3. 添加UPDATE规则,禁止修改创建日期
    为了防止用户后续修改消息的创建时间,补充更新权限规则,限制created_at字段不能被修改:

    CREATE OR REPLACE POLICY "用户仅能更新自身消息且不可修改创建日期" ON messages
    FOR UPDATE TO authenticated
    USING (auth.uid() = user_id)
    WITH CHECK (created_at = OLD.created_at);
    

备选方案:强制插入时created_at必须为空

如果你确实需要限制用户不能传入该字段,可以在RLS规则中添加校验,要求created_at必须为NULL:

CREATE OR REPLACE POLICY "用户仅能插入自身消息且不可指定创建日期" ON messages
FOR INSERT TO authenticated
WITH CHECK (auth.uid() = user_id AND created_at IS NULL);

但这个方案的弊端是,如果用户误传了created_at字段(哪怕是正确的当前时间),插入操作会直接失败,用户体验不如覆盖方案友好。

内容的提问来源于stack exchange,提问作者Anton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:40:30