在 postgres 中授予本地用户对外部数据库 table 的权限

Granting local user permissions to a foreign db table in 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' 似乎推断如果它是为了向本地用户 test_user 授予 select 对 fdtest 外部数据包装器上的 table foo 的权限.但是,我将如何解释此命令是它在本地 table foo(不存在)上向 test_user 授予 select 权限。正如预期的那样,当我 运行 这个命令时,我得到一个错误:

ERROR:  relation "foo" does not exist

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

您必须连接到远程数据库和 运行 那里的 GRANT 语句。

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

他们显示的连接是环回连接,它只是连接回同一台服务器和(显然)您已经在其中的数据库。这对于测试目的很有用。所以在本地服务器上授予权限与在远程服务器上授予权限是一样的,因为它们是同一台服务器。

它们没有显示 table 的创建,您可以在回归测试 contrib/dblink/sql/dblink.sql 中找到它(文档中的示例源自此):

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