如何 运行 不同模式上的相同功能

How to run the same function on different schemas

我有多个结构相同但数据不同的模式/用户。在这些数据上执行了一些存储函数,到目前为止,它们存储在每个模式中。我想将这些功能一起存储在一个新模式中,这样可以更轻松地更新代码,...因为它会集中。

我认为,由于 search_path 被定义为 "$user",public,它将引用当前会话/连接的用户,因此来自不同模式的那些查询最终也将具有相同的 search_path.

假设我有一个 table T1 供用户 u1, u2, u3 和一个使用此 table F1.

的函数

最初,F1 将被复制到模式 u1, u2, u3 中,而 运行 select * from F1() 将适用于每个用户。然而,随着用户数量的增加,更新函数会变得越来越困难,所以我想要一个新的架构 functions,其中只有一个 F1 函数。

现在,运行 select * from functions.F1() returns 一个错误,无法找到 T1。但是用户 search_paths 仍然包含相同的信息。那么为什么 search_path 会根据执行它的函数而改变,我该如何防止它发生呢?

在 postgres 邮件列表上有一封关于此的邮件:http://postgresql.nabble.com/function-doesn-t-see-change-in-search-path-td4971325.html,最后的解决方法是我原来的情况。也许同时发生一些变化?

Add a table parameter to F1.然后将uf1uf2uf3添加到u1u2u3。这些函数只会调用 F1 并传入正确的 table.

其实我的想法是对的。但是,当我创建新模式时,通过导出旧函数,pg_dump 在每个函数的定义中添加了 SECURITY DEFINER

将此更改为 SECURITY INVOKER 会产生预期的行为(我)

来自 documentation:

SECURITY INVOKER indicates that the function is to be executed with the privileges of the user that calls it. That is the default. SECURITY DEFINER specifies that the function is to be executed with the privileges of the user that created it.

看看plproxy。这就是 Skype 用来 运行 通过具有包装函数的代理数据库查询多个数据库分片的方式。

您还可以编写一个包装函数,它在每个模式中查找所有函数并调用它们。