我有启用了行级安全性的表,以及相关的策略--运行得很好。
我的问题是,有时,基于某些条件,我希望在函数执行过程中绕过特定语句的策略。
类似于:
...
statement 1
statement 2
if (some cond) then
disable rls temporarily
statement 3 -- mostly delete rows the user can't normally see
enable rls
else
statement 3
end if我实现它的方式是创建一个函数check_cond,它返回一个布尔值计算some cond,并创建一个额外的选择策略,该策略调用这个check_cond。
它可以工作,但实际问题是,查询select * from tab现在看起来如下:select * from tab where <original policy condition> or check_cond()
这个or check_cond()导致后置总是做一个完整的表格扫描,因为它不能评估结果预先规划。
如果我能够在策略中编写“动态”代码,我就可以根据check_cond()的值添加/删除条件,但据我所知,这是不可能的。
有什么聪明的方法可以让我暂时禁用rls或者在不牺牲性能的情况下动态添加条件?
谢谢。
发布于 2020-02-19 11:52:48
最简单的方法是让超级用户拥有一个SECURITY DEFINER函数,该函数运行:
ALTER ROLE someuser BYPASSRLS;其中someuser是运行SQL语句的用户。
之后,您可以以同样的方式重新启用它。
但这是相当不安全的,因为没有什么能阻止用户在其他时候调用这些函数。
更好的方法是使用BYPASSRLS定义用户拥有的安全定义器函数,该函数为您执行删除操作。
注意:出于安全考虑,在定义SECURITY DEFINER函数时总是 SET search_path。
https://stackoverflow.com/questions/60298121
复制相似问题