根据表值找出哪个模式

Gor*_*oro 4 sql django postgresql database-connection postgresql-9.2

我的数据库基于客户端分成模式(即:每个客户端都有自己的模式,具有相同的数据结构).

我也碰巧有一个外部动作,不知道它应该针对哪个架构.它来自系统的另一部分,它没有客户端的概念,也不知道它在哪个客户端设置中运行.在我处理它之前,我必须找出请求需要定位的模式

为了找到正确的模式,我必须找出哪个包含R特定唯一ID 的记录(字符串)

从我的理解,以下

SET search_path TO schema1,schema2,schema3,...
Run Code Online (Sandbox Code Playgroud)

将只查看schema1中的表(或与表匹配的第一个模式),并且不会进行全局搜索.

有没有办法让我在所有模式中进行全局搜索,或者我只需要使用for循环并迭代所有模式,一次一个?

Erw*_*ter 5

你可以使用继承.(一定要考虑限制.)

考虑这个小小的演示:

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;
Run Code Online (Sandbox Code Playgroud)

现在,要实际识别特定行所在的表,请使用tableoid:

SELECT *, tableoid::regclass AS table_name
FROM   master.tbl
WHERE  id = 2;
Run Code Online (Sandbox Code Playgroud)

结果:

id | foo | table_name
---+-----+-----------
2  | y   | y.tbl
Run Code Online (Sandbox Code Playgroud)

您可以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;
Run Code Online (Sandbox Code Playgroud)

这也是很多不是通过许多不同的表循环更快.