我已经构建了全新的PostgreSQL-9.5(alpha),我对row level security的新功能感到非常兴奋。这有望使多角色访问管理变得更加直接。
作为一个例子,我到目前为止使用的模型中NOLOGIN
角色是数据库的所有者以及所有表,视图,函数等;然后创建视图以授予对特定角色的适当访问权限。一切都很好,但观点确实激增。具有CREATE POLICY
的表上的新ENABLE ROW LEVEL SECURITY
命令看起来是达到相同目的的更清晰的替代方案。
但是,到目前为止,我还无法确定哪些表是启用RLS的,以及在它们上定义了哪些策略。 (显然已经定义了表和策略之后的所有这些。)是否有一种简单的方法可以在启用RLS的表上识别已建立的策略?
(对于那些感兴趣的人,以及许多性能改进,还有期待已久的UPSERT
和更多jsonb
函数。)
答案 0 :(得分:5)
好的,想通了。 (Geez,还没有人用9.5?)
问题1:哪些表具有行级安全性?
pg_class
关系有一个新列relrowsecurity boolean
,它看起来很简单:
SELECT oid, relname FROM pg_class WHERE relrowsecurity = 'true';
问题2:在启用RLS的表上定义了哪些策略?
系统目录有一个新关系pg_policy
,它存储有关策略的所有信息,特别是策略名称,表的oid
,它适用的命令,角色(该政策适用的oid[]
}以及USING
和WITH CHECK
条款。
有趣的是,后两者存储为pg_node_tree
,它与受策略的查询的执行计划合并,因此不会在每次调用时重新评估策略的条件。这使得这种方法可能比使用问题中详细阐述的视图更快,因为每次调用都必须解析和评估更少的子句。