PostgreSQL:用于跨多个数据库查询的函数

时间:2019-07-05 12:38:43

标签: sql postgresql function union

我在同一个PostgreSQL服务器上有几个数据库,它们的表完全相同,列也完全相同。我想编写一个用户可以用来一次查询所有这些数据库的函数,就像这样:

SELECT * FROM all_databases();

此刻,我刚刚找到了如何查询另一个数据库:

-- 1. Get database names
SELECT datname
FROM pg_database
WHERE name LIKE '%someString%';

-- 2. Get data from different databases with postgres_fdw (same host or remote host)
-- 2.1. Install the module
CREATE EXTENSION postgres_fdw;
-- 2.2. Create a server connection
CREATE SERVER foreign_db  
FOREIGN DATA WRAPPER postgres_fdw  
OPTIONS (host 'localhost', dbname 'foreignDbName', port '5432');
-- 2.3. Create user mapping for the foreign server
CREATE USER MAPPING FOR CURRENT_USER  
SERVER foreign_db  
OPTIONS (user 'postgres', password 'password');  
-- 2.4. Import the foreign schema
IMPORT FOREIGN SCHEMA public  
FROM SERVER foreign_db INTO public; 

所以,我要做的是对1所返回的每个结果执行类似于2中编写的内容。看来我将不得不使用一些动态SQL,但是我有点迷失了…… / p>

1 个答案:

答案 0 :(得分:0)

首先,如果两个数据库中的表具有相同的名称,则不能将其导入相同的模式,而必须将其导入另一个模式或使用另一个外部表名称手动导入。(请参见CREATE FOREIGN TABLE

第二,您可以对外部表进行简单的SELECT查询。例如

CREATE SCHEMA ft_db2; -- foreign tables db2 schema

IMPORT FOREIGN SCHEMA public  
FROM SERVER foreign_db INTO ft_db2;

CREATE OR REPLACE FUNCTION all_databases()
  RETURNS SETOF public.test AS
$$
SELECT * FROM public.test
UNION ALL
SELECT * FROM ft_db2.test;
$$
  LANGUAGE sql;

SELECT * FROM all_databases();