我有seveval数据库在一个postgresql db服务器
每个数据库都有自己的用户名/密码,并且只能通过指定模式访问(实际上,模式与用户名同名)
我想创建一个all_tables视图,这样我以后就可以查询了。
我对dblink
扩展做了一些研究,但仍然无法使其工作。
SELECT dblink_connect('source_db_1', 'postgres://db_1:[email protected]/db_1?sslmode=require');
CREATE SERVER source_db_1 FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr 'psqlserver.postgres.database.azure.com', dbname 'db_1');
CREATE USER MAPPING FOR current_user SERVER source_db_1 OPTIONS (user 'db_1', password 'password');
SELECT dblink_connect('source_db_2', 'postgres://db_2:[email protected]/db_2?sslmode=require');
CREATE SERVER source_db_2 FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr 'psqlserver.postgres.database.azure.com', dbname 'db_2');
CREATE USER MAPPING FOR current_user SERVER source_db_2 OPTIONS (user 'db_2', password 'password');
CREATE OR REPLACE VIEW all_tables_in_db_1 AS
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'db_1';
CREATE OR REPLACE VIEW all_tables_in_db_2 AS
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'db_2';
CREATE OR REPLACE VIEW all_tables_in_db_3 AS
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'db_3';
CREATE OR REPLACE VIEW all_tables AS
SELECT * FROM all_tables_in_db_1
UNION ALL
SELECT * FROM all_tables_in_db_2
UNION ALL
SELECT * FROM all_tables_in_db_3;
字符串
所有命令运行正常,但在all_tables
中查询时,没有任何表
1条答案
按热度按时间ujv3wf0j1#
dblink_fdw
可以,但建议您使用原生postgres_fdw
。1.您不需要同时设置
dblink_connect
和server
以及user mapping
,您可以使用前者来管理连接以调用dblink_execute
,使用后者来设置外部数据 Package 器,然后使用foreign table
来使用它们。1.您所做的并不会自动将其他数据库中所有内容的可见性添加到您的
information_schema
。您可以通过dblink_exec
运行查询并处理其输出,或者一次为许多表设置foreign table
或import foreign schema
。第二个选项与您期望的最相似。下面是一个示例,展示了如何为多个数据库设置
information_schema.tables
。Demo at db<>fiddle:字符串
不幸的是,
create foreign table
不接受(like another_table)
语法,因此您需要自己列出列名和类型。在不同版本的PostgreSQL中,内置表和视图可以有不同顺序的不同列名,当你将它们链接为
foreign table
时,你需要记住这一点:这里是一个视图定义重用出错的例子。