Postgres:根据会话变量自动填充“插入”字段

问题描述

我有一个由 Postgres 支持的网络应用。

  • 每个 Web 应用请求应仅读取/写入当前登录用户的数据。
  • 每个包含用户数据的表都有一个 user_id 列。

我偶尔会遇到错误,我忘记将 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_idSELECT 请求时完全忽略 UPDATE

我剩下的问题是 INSERT。有没有办法避免在 user_id 上提供 INSERT

解决方法

看看manual

根据 USING 中指定的表达式检查现有表行,而通过 INSERT 或 UPDATE 创建的新行是 根据 WITH CHECK 中指定的表达式进行检查

似乎您只需要在策略中添加 WITH CHECK 子句以及 USING 子句,该子句将应用于 INSERT 和 UPDATE 语句。