8

我已经构建了全新的 PostgreSQL-9.5 (alpha),我对行级安全的新特性感到非常兴奋。这有望使多角色访问管理更加直接。

例如,到目前为止,我使用了一个模型,其中NOLOGIN角色是数据库和所有表、视图、函数等的所有者;然后创建视图以授予对特定角色的适当访问权限。一切都很好,但观点确实激增。表上的新CREATE POLICY命令ENABLE ROW LEVEL SECURITY看起来是达到相同目的的更清洁的替代方案。

但是,到目前为止,我无法确定哪些表启用了 RLS 以及在它们上定义了哪些策略。(显然,所有这些都是在定义表和策略之后进行的。)是否有一种简单的方法可以识别启用 RLS 的表上的既定策略?

(对于那些感兴趣的人来说,还有期待已久的UPSERT更多jsonb功能,以及许多性能改进。)

4

1 回答 1

5

好的,想通了。(天啊,还没人用9.5???)

问题 1:哪些表具有行级安全性?

pg_class关系有一个新列relrowsecurity boolean,它看起来很简单:

SELECT oid, relname FROM pg_class WHERE relrowsecurity = 'true';

问题 2:在启用 RLS 的表上定义了哪些策略?

系统目录有一个新关系pg_policy,它存储有关策略的所有信息,特别是策略的名称、oid表的名称、它适用的命令、oid[]策略适用的角色 ( ) 以及USINGandWITH CHECK子句。

有趣的是,后两者存储为 a pg_node_tree,它与受策略约束的查询的执行计划合并,因此不会在每次调用时重新评估策略的条件。这使得这种方法可能比使用问题中阐述的视图更快,因为每次调用都需要解析和评估更少的子句。

于 2015-07-07T08:29:01.733 回答