第一次在 Postgres 中设置 MONGO_FDW。
第一步是以默认postgres
用户身份连接后添加扩展程序:
CREATE EXTENSION mongo_fdw;
应用程序用户是app_user
,所以我同意:
GRANT CREATE SERVER TO app_user;
然后我连接为app_user
并发出:
CREATE SERVER "app_rem_db"
FOREIGN DATA WRAPPER mongo_fdw
OPTIONS (
address 'localhost',
port '27017'
);
但我收到错误:
ERROR: foreign-data wrapper "mongo_fdw" does not exist
然而,如果我运行它,CREATE SERVER
因为postgres
它有效。
如何允许其他用户创建服务器?
继续用户postgres
,我接下来创建用户映射:
CREATE USER MAPPING FOR app_user
SERVER "app_rem_db"
OPTIONS (username 'app_user_pg', password 'hello123');
如果我再次连接app_user
并尝试创建一个外部表,我会得到(mongoDB 有一个数据库mongo_test
和其中的集合testcol
):
CREATE FOREIGN TABLE mongo_testtab
(
data JSON
)
SERVER "app_rem_db"
OPTIONS (database 'mongo_test', collection 'testcol');
我再次收到错误:
ERROR: server "app_rem_db" does not exist
如果我切换回postgres
用户,我可以创建外部表。
但是当我尝试查询该表时,我得到:
select * from mongo_testtab;
ERROR: relation "mongo_testtab" does not exist
LINE 1: select * from mongo_testtab;
扩展必须以超级用户身份创建,没有办法解决这个问题。创建扩展时,请确保连接到正确的数据库(而不是
postgres
)。然后有两个选择:
您授予FDW 权限
app_user
:USAGE
然后您可以将外部服务器创建为
app_user
.优点:作为超级用户,您需要执行的操作更少
缺点:您修改了属于扩展的对象,该对象将在转储/恢复期间丢失
您将外部服务器创建为超级用户,然后授予外部服务器上的权限
app_user
:USAGE
优点:您不需要修改扩展对象
缺点:作为超级用户需要完成更多工作