postgresql RLS策略:每个用户每个问题一票

owfi6suc  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(124)

我正在努力创建一个RLS策略,以确保每个用户只能对每个问题投票一次(在我的情况下,问题就是账单)。
vote表列出了用户和账单。每个用户都可以为每个账单投票一次:

| id | user_id | bill_id | vote       |
| -- | ------- | ------- | ---------- |
| 1  | 25      | 12      | yes        |
| 2  | 38      | 12      | yes        |
| 3  | 12      | 12      | no         |
| 4  | 62      | 8       | abstention |

我尝试了以下策略,其中错误**错误更新策略:无法用给定的ID更新pg.policies:表“new”**的FROM子句条目丢失。

CREATE POLICY vote_once_policy ON vote
  FOR INSERT
  WITH CHECK ((
    SELECT COUNT(*) FROM vote
    WHERE bill_id = NEW.bill_id AND user_id = NEW.user_id
  ) = 0);

知道我哪里做错了吗或者有没有其他方法可以确保每个用户只能为每个账单投票一次?
确定不好感谢你的评分
支持RLS策略编辑器:

支持票表:

wrrgggsh

wrrgggsh1#

正如在问题的注解中提到的,RLS不能强制唯一性,只有唯一约束可以。计算记录数的查询只能看到已提交的记录,而不能看到正在运行的记录。(感谢@frank-heikens和@bergi)
约束可以如下所示:

ALTER TABLE vote ADD CONSTRAINT unique_vote_per_user_per_bill UNIQUE (bill_id, user_id);

相关问题