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

如何编写Supabase策略,允许公共用户仅向articles表likes列插入数据?

需求可行性与实现方案

这个需求是可行的,但需要先明确操作逻辑:INSERT是针对整行的操作,所谓"仅对likes列执行INSERT",实际是指公共用户插入新行时只能指定likes列的值,其他列需依赖默认值、自动生成规则(如主键自增)或允许为NULL。如果你的真实需求是给已有文章点赞(即增加likes的数值),那应该用UPDATE权限控制而非INSERT,这点要区分清楚。


针对主流数据库的实现代码

1. MySQL 环境

第一步:创建公共访问用户(若未存在)

CREATE USER 'public_liker'@'%' IDENTIFIED BY 'secure_password_here';

第二步:授予精准的INSERT权限

-- 仅允许用户在articles表的INSERT操作中指定likes列
GRANT INSERT(likes) ON your_database.articles TO 'public_liker'@'%';

权限验证示例

用户登录后,仅能执行指定likes列的插入:

-- 合法操作
INSERT INTO articles(likes) VALUES(1);

-- 非法操作(会被拒绝,无其他列的插入权限)
INSERT INTO articles(title, content, likes) VALUES('新文章', '内容', 1);

2. PostgreSQL 环境

第一步:创建公共角色/用户

CREATE ROLE public_liker WITH LOGIN PASSWORD 'secure_password_here';

第二步:授予列级INSERT权限

GRANT INSERT(likes) ON TABLE articles TO public_liker;

补充:若需求是给已有文章点赞(UPDATE操作)

如果你的真实场景是用户给已存在的文章点赞(即likes列数值递增),则需要授予UPDATE权限并限制仅能修改likes列,还可配合触发器防止恶意篡改:

MySQL 示例

-- 授予UPDATE权限
GRANT UPDATE(likes) ON your_database.articles TO 'public_liker'@'%';

-- 创建触发器限制likes只能递增
DELIMITER //
CREATE TRIGGER trg_restrict_likes_update BEFORE UPDATE ON articles
FOR EACH ROW
BEGIN
    IF NEW.likes < OLD.likes THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '仅允许增加点赞数,禁止减少';
    END IF;
END //
DELIMITER ;

PostgreSQL 示例

-- 授予UPDATE权限
GRANT UPDATE(likes) ON TABLE articles TO public_liker;

-- 创建触发器限制likes只能递增
CREATE OR REPLACE FUNCTION check_likes_increment()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.likes < OLD.likes THEN
        RAISE EXCEPTION '仅允许增加点赞数,禁止减少';
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_restrict_likes_update
BEFORE UPDATE ON articles
FOR EACH ROW EXECUTE FUNCTION check_likes_increment();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:50:17