使用 SECURITY DEFINER 函数修复 PostgreSQL 行级安全中的循环依赖问题
PostgreSQL 中的行级安全(Row-level security)是多租户应用中最有用的功能之一。其原理很简单:在表上定义策略,告知 PostgreSQL 某个用户允许查看或修改哪些行,数据库引擎会在每次查询时强制执行该策略,无论是由哪段应用程序代码发起的请求。问题出现在当你的策略形成循环时。这种情况比听起来更常见,并导致 PostgreSQL 中一种令人困惑的故障模式:本应返回数据的查询却返回空结果,且没有任何错误。