我有一个 Postgres 14 数据库,想要实现以下场景:
is_hidden
我最近在表中添加了一列foo
。我的应用程序中有几个查询(大约 15 个读取操作)foo
直接或间接(通过联接)使用该表。
我需要从所有查询中排除带有is_hidden
as 的所有行。true
我应该如何实现这个目标?
两种解决方案:
显然,一一更新所有相关查询并添加一个WHERE NOT is_hidden
子句。寻找不易出错、较短且易于恢复的解决方案。
根本没有该is_hidden
列,并将该行完全移到单独的表中hidden_foo
。但由于商业原因,目前这是不可能的。
这是 PostgreSQL中行安全策略(通常也称为行级安全性)的一个很好的用例:
除了通过 GRANT 提供的 SQL 标准权限系统之外,表还可以具有行安全策略,以每个用户为基础限制哪些行可以通过正常查询返回或通过数据修改命令插入、更新或删除。此功能也称为行级安全性。默认情况下,表没有任何策略,因此如果用户根据 SQL 权限系统拥有表的访问权限,则表中的所有行都同样可用于查询或更新...
行安全策略可以特定于命令或角色,或两者。可以指定策略以应用于所有命令,或者应用于 SELECT、INSERT、UPDATE 或 DELETE。
通过行安全策略,您可以定义一个表达式,过滤掉特定表中为 true 的行is_hidden
,然后将该策略应用于特定用户或一组用户的角色。正如上面提到的文档,您可以选择仅针对单个命令(例如SELECT
s only)或多个命令(例如UPDATE
s 和DELETE
s)强制执行该策略。
归档时间: |
|
查看次数: |
687 次 |
最近记录: |