在 Postgresql 中使用 PUBLIC 和 PRIVATE FUNCTIONS 的惯用方式是什么?

What is the idiomatic way of having PUBLIC and PRIVATE FUNCTIONS in Postgresql?

拜托,

我在空闲时间在 supabase(PG 13.3) 中进行 PoC,虽然我将主要功能分解为更小的功能(为了重用目的),但我希望 applications/clients 只有访问其中三个(“public”函数)。所以大部分的功能只有这三个主要功能用到。

考虑托管解决方案(RDS 或 Google 云 SQL),将对 applications/clients 的访问限制为仅这三个功能并防止它们查看和访问的最佳方法是什么执行其他“私有”功能。

我用谷歌搜索,但还没有找到答案。

如有任何帮助,我们将不胜感激。

谢谢

您可以采用两种方法:

  1. 将您不希望用户使用的辅助功能放在不在 search_path 上的不同架构中,并且不要记录它们。

    那么只能用不同的模式限定来调用它们,所以它们不会被误调用。但是,这并不能阻止用户使用这些功能,只会让他们望而却步。

  2. REVOKEPUBLIC 获得辅助功能的权限,并且只将它们授予主要功能的所有者。然后将这些主要功能声明为 SECURITY DEFINER(并确保 set search_path on them!)。

    这种方法的主要缺点是所有函数都以所有者身份执行,因此您不能使用 PostgreSQL 的正常权限检查来确保调用者不会访问任何它没有权限的数据。

我个人更喜欢第一种方法。