向Postgres中的外部数据库表授予本地用户权限

问题描述

我根据文档使用dblink_connect建立了与外部数据库的连接:

CREATE SERVER fdtest FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr '127.0.0.1',dbname 'foreign_test_db');

CREATE USER test_user WITH PASSWORD 'secret';
CREATE USER MAPPING FOR test_user SERVER fdtest OPTIONS (user 'test_user',password 'secret');
GRANT USAGE ON FOREIGN SERVER fdtest TO regress_dblink_user;
GRANT SELECT ON TABLE foo TO test_user;

\c - regress_dblink_user
SELECT dblink_connect('myconn','fdtest');


SELECT * FROM dblink('myconn','SELECT * FROM foo') AS t(a int,b text,c text[]);

最后的“ GRANT SELECT”似乎暗示着,如果要向fdtest外来数据包装器上的表foo授予对本地用户test_user的选择权限。但是,我如何解释此命令是它授予test_user在本地表foo(不存在)上选择的权限。不出所料,当我运行此命令时,我得到一个错误

ERROR:  relation "foo" does not exist

我很想知道如何真正做到这一点。我希望能够限制本地用户只能从外部数据包装器访问某些表。

解决方法

您必须连接到远程数据库并在其中运行GRANT语句。

您当然可以通过dblink做到这一点,但是您必须与超级用户或表的所有者建立联系。

,

他们显示的连接是一个环回连接,它仅连接回您所在的同一台服务器和(显然)数据库。这对测试很有用。因此,在本地服务器上授予权限与在远程服务器上授予权限相同,因为它们是同一服务器。

它们不显示表的创建,您可以在回归测试contrib / dblink / sql / dblink.sql(文档中的示例从中得出)中找到它,如下所示:

CREATE TABLE foo(f1 int,f2 text,f3 text[],primary key (f1,f2));