问题描述
我偶尔会遇到错误,我忘记将 user_id = ?
添加到 sql 请求的 WHERE
子句。为了以一般方式防止此问题,我正在研究 Postgres 行级安全性 (article):
- 为每个用户数据表设置政策:
CREATE POLICY table_policy ON table USING (user_id::TEXT = current_setting('app.user_id'))
- 在网络应用中,当请求开始时,在请求的连接上设置当前登录的用户 ID:
SET app.user_id = ?
。
这允许我在写入 user_id
和 SELECT
请求时完全忽略 UPDATE
。
我剩下的问题是 INSERT
。有没有办法避免在 user_id
上提供 INSERT
?
解决方法
看看manual:
根据 USING 中指定的表达式检查现有表行,而通过 INSERT 或 UPDATE 创建的新行是 根据 WITH CHECK 中指定的表达式进行检查
似乎您只需要在策略中添加 WITH CHECK
子句以及 USING
子句,该子句将应用于 INSERT 和 UPDATE 语句。