我的数据库被分成基于客户端的模式(即:每个客户端都有自己的模式,具有相同的数据结构).
我也碰巧有一个外部动作,不知道它应该针对哪个架构.它来自系统的另一部分,它没有客户端的概念,也不知道它在哪个客户端设置中运行.在我处理它之前,我必须找出请求需要定位的模式
为了找到正确的模式,我必须找出哪个包含特定唯一ID的记录R(字符串)
从我的理解,以下
SET search_path TO schema1,schema2,schema3,...
将只查看schema1中的表(或与表匹配的第一个模式),并且不会进行全局搜索.
有没有办法让我在所有模式中进行全局搜索,或者我只需要使用for循环并迭代所有模式,一次一个?
解决方法
你可以使用
inheritance. (一定要考虑
limitations.)
考虑这个小演示:
CREATE SCHEMA master; -- no access of others .. CREATE SEQUENCE master.myseq; -- global sequence to have globally unique id CREATE table master.tbl ( id int primary key DEFAULT nextval('master.myseq'),foo text); CREATE SCHEMA x; CREATE table x.tbl() INHERITS (master.tbl); INSERT INTO x.tbl(foo) VALUES ('x'); CREATE SCHEMA y; CREATE table y.tbl() INHERITS (master.tbl); INSERT INTO y.tbl(foo) VALUES ('y'); SELECT * FROM x.tbl; -- returns 'x' SELECT * FROM y.tbl; -- returns 'y' SELECT * FROM master.tbl; -- returns 'x' and 'y' <-- !! -- clean it all up: -- DROP SCHEMA x,y,master CASCADE;
现在,要实际识别特定行所在的表,请使用tableoid
:
SELECT *,tableoid::regclass AS table_name FROM master.tbl WHERE id = 2;
结果:
id | foo | table_name ---+-----+----------- 2 | y | y.tbl
您可以从tableoid派生源模式,最好是直接使用tableoid查询系统目录. (显示的名称取决于search_path的设置.)
SELECT n.nspname FROM master.tbl t JOIN pg_class c ON c.oid = t.tableoid JOIN pg_namespace n ON c.relnamespace = n.oid WHERE t.id = 2;
这比循环遍历许多单独的表要快得多.