我的数据库根据客户端分为多个模式(即:每个客户端具有它们自己的具有相同数据结构的模式)。
我还碰巧有一个外部操作不知道它应该以哪个模式为目标。它来自系统的另一个部分,该部分没有客户机的概念,也不知道它正在哪个客户机集中操作。在处理它之前,我必须找出请求需要以哪个模式为目标
为了找到正确的模式,我必须找出哪个模式保存了具有特定唯一ID(字符串)的记录R
据我了解,以下
SET search_path TO schema1,schema2,schema3,...
将只查看schema1(或与表匹配的第一个模式)中的表,而不执行全局搜索。
有没有一种方法可以对所有模式进行全局搜索,或者我只需要使用for循环,一次迭代一个模式?
3条答案
按热度按时间c2e8gylq1#
为此,您可以使用inheritance(请务必考虑限制)。
请看这个小演示:
现在,要实际标识特定行所在的表,请使用
tableoid
:结果:
您可以从
tableoid
导出源模式,最好直接用tableoid
查询系统目录(显示的名称取决于search_path
的设置)。这也比遍历许多单独的表快得多。
t2a7ltrp2#
你必须遍历所有的名称空间,你可以从
pg_*
系统目录中获得大量的信息,理论上,你应该能够在请求时解析客户机-〉模式Map,而不需要与数据库对话,这样你所做的第一个SQL调用是:e1xvtsh33#
虽然我认为如果可以重新构建表,Erwin的解决方案可能更可取,但另一种不需要任何模式更改的方法是编写一个PL/PgSQL函数,该函数基于系统目录信息使用动态SQL扫描表。
给定:
以下PL/PgSQL函数在包含名为
_tabname
的表的所有方案中搜索_colname
中等于_value
的值,并返回第一个匹配的方案。如果没有匹配则返回null。如果有多个匹配则结果将是其中之一,但不保证是哪一个。如果要返回(比如说)字母顺序的第一个或其他什么。如果你想返回 * all *,这个函数也被简单地修改为返回
setof text
和RETURN NEXT cur_schema
火柴。顺便说一句,如果愿意,您可以重用没有继承的表定义,而且您确实应该这样做。
在这种情况下它们共享相同的数据类型但不共享任何数据;或或通过
LIKE
:在这种情况下,它们在创建后彼此完全不连接。