首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >暂时跳过RLS检查

暂时跳过RLS检查
EN

Stack Overflow用户
提问于 2020-02-19 10:25:21
回答 1查看 769关注 0票数 0

我有启用了行级安全性的表,以及相关的策略--运行得很好。

我的问题是,有时,基于某些条件,我希望在函数执行过程中绕过特定语句的策略。

类似于:

代码语言:javascript
复制
...
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或者在不牺牲性能的情况下动态添加条件?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-19 11:52:48

最简单的方法是让超级用户拥有一个SECURITY DEFINER函数,该函数运行:

代码语言:javascript
复制
ALTER ROLE someuser BYPASSRLS;

其中someuser是运行SQL语句的用户。

之后,您可以以同样的方式重新启用它。

但这是相当不安全的,因为没有什么能阻止用户在其他时候调用这些函数。

更好的方法是使用BYPASSRLS定义用户拥有的安全定义器函数,该函数为您执行删除操作。

注意:出于安全考虑,在定义SECURITY DEFINER函数时总是 SET search_path

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60298121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档