dblink

dblink模块支持从数据库会话中连接到其他Greenplum数据库数据库。 这些数据库可以驻留在相同的Greenplum数据库系统中,也可以驻留在远程系统中。

Greenplum数据库支持Greenplum数据库安装中具有相同主要版本号的数据库之间的dblink连接。 您还可以使用dblink连接到使用兼容libpq库的其他Greenplum数据库安装。

Note: dblink适用于数据库用户在其他数据库中执行简短的临时查询。 dblink不能替代外部表或gpcopy之类的管理工具。

Greenplum数据库dblink模块是PostgreSQL dblink模块的修改版本。 在Greenplum数据库中使用该模块时,存在一些限制。

安装和注册模块

当您安装Greenplum数据库时,将安装dblink模块。 在使用模块中定义的任何函数之前,必须在要使用这些函数的每个数据库中注册dblink扩展。

Greenplum数据库注意事项

在此版本的Greenplum数据库中,修改表数据的语句不能使用命名或隐式dblink连接。 而是必须直接在dblink()函数中提供连接字符串。例如:

  1. gpadmin=# CREATE TABLE testdbllocal (a int, b text) DISTRIBUTED BY (a);
  2. CREATE TABLE
  3. gpadmin=# INSERT INTO testdbllocal select * FROM dblink('dbname=postgres', 'SELECT * FROM testdblink') AS dbltab(id int, product text);
  4. INSERT 0 2

dblink的Greenplum数据库版本禁用以下异步函数:

  • dblink_send_query()
  • dblink_is_busy()
  • dblink_get_result()

使用dblink

以下过程确定了在Greenplum数据库中配置和使用dblink的基本步骤。 这些示例使用dblink_connect()创建与数据库的连接,并使用dblink()执行SQL查询。

  1. 首先创建一个示例表以使用dblink函数进行查询。 这些命令在postgres数据库中创建一个小表,稍后您将使用dblink从testdb数据库中查询该表:

    1. $ psql -d postgres
    2. psql (9.4.20)
    3. Type "help" for help.
    4. postgres=# CREATE TABLE testdblink (a int, b text) DISTRIBUTED BY (a);
    5. CREATE TABLE
    6. postgres=# INSERT INTO testdblink VALUES (1, 'Cheese'), (2, 'Fish');
    7. INSERT 0 2
    8. postgres=# \q
    9. $
  2. 以超级用户身份登录到另一个数据库。 在此示例中,超级用户gpadmin登录到数据库testdb。 如果dblink函数尚不可用,请在数据库中注册dblink扩展:

    1. $ psql -d testdb
    2. psql (9.4beta1)
    3. Type "help" for help.
    4. testdb=# CREATE EXTENSION dblink;
    5. CREATE EXTENSION
  3. 使用dblink_connect()函数创建与另一个数据库的隐式或命名连接。 您提供的连接字符串应该是libpq样式的关键字/值字符串。 本示例创建一个名为mylocalconn的连接到本地Greenplum数据库系统上的postgres数据库:

    1. testdb=# SELECT dblink_connect('mylocalconn', 'dbname=postgres user=gpadmin');
    2. dblink_connect
    3. ----------------
    4. OK
    5. (1 row)

    Note: 如果未指定user,则在启动Greenplum数据库时,dblink_connect()将使用PGUSER环境变量的值。 如果未设置PGUSER,则默认值为启动Greenplum数据库的系统用户。

  4. 使用dblink()函数可使用已配置的连接查询数据库。 请记住,此函数返回记录类型,因此您必须分配dblink()查询中返回的列。 例如,以下命令使用命名连接来查询您先前创建的表:

    1. testdb=# SELECT * FROM dblink('mylocalconn', 'SELECT * FROM testdblink') AS dbltab(id int, product text);
    2. id | product
    3. ----+---------
    4. 1 | Cheese
    5. 2 | Fish
    6. (2 rows)

要以另一个用户身份连接到本地数据库,请在连接字符串中指定该用户。 本示例以用户test_user的身份连接到数据库。 使用dblink_connect(),超级用户无需指定密码即可创建与另一个本地数据库的连接。

  1. testdb=# SELECT dblink_connect('localconn2', 'dbname=postgres user=test_user');

要建立与远程数据库系统的连接,请在连接字符串中包含主机和密码信息。 例如,要创建到远程系统的隐式dblink连接:

  1. testdb=# SELECT dblink_connect('host=remotehost port=5432 dbname=postgres user=gpadmin password=secret');

作为非超级用户使用dblink

要使用dblink_connect()与数据库建立连接,非超级用户必须在连接字符串中包含主机,用户和密码信息。 即使连接到本地数据库,也必须包括主机,用户和密码信息。 例如,用户test_user可以使用以下命令创建到本地系统mdw的dblink连接:

  1. testdb=> SELECT dblink_connect('host=mdw port=5432 dbname=postgres user=test_user password=secret');

如果非超级用户需要创建不需要密码的dblink连接,则可以使用dblink_connect_u()函数。 dblink_connect_u()函数与dblink_connect()相同,区别在于它允许非超级用户创建不需要密码的连接。

最初安装dblink_connect_u()时,它具有从PUBLIC撤消的所有特权,因此除超级用户外,它无法调用。 在某些情况下,将dblink_connect_u()的EXECUTE权限授予被认为可信任的特定用户可能是适当的,但是应格外小心。

Warning: 如果Greenplum数据库系统为用户配置了不涉及密码的身份验证方法, 那么当非超级用户执行dblink_connect_u()时,可能会冒充他人,并随后升级特权。 dblink连接似乎源自该函数指定的用户。 例如,非超级用户可以执行dblink_connect_u()并指定使用trust认证配置的用户。

同样,即使dblink连接需要密码,也可以从服务器环境中提供该密码,例如属于服务器用户的~/.pgpass文件。 建议所有属于服务器用户的~/.pgpass文件都不要包含任何指定通配符主机名的记录。

  1. 作为超级用户,对用户数据库中的dblink_connect_u()函数授予EXECUTE特权。 本示例向具有创建隐式或命名dblink连接的签名的函数的非超级用户test_user授予特权。

    1. testdb=# GRANT EXECUTE ON FUNCTION dblink_connect_u(text) TO test_user;
    2. testdb=# GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO test_user;
  2. 现在,test_user无需密码即可创建到另一个本地数据库的连接。 例如,test_user可以登录到testdb数据库并执行此命令以创建一个名为testconn的连接到本地postgres数据库。

    1. testdb=> SELECT dblink_connect_u('testconn', 'dbname=postgres user=test_user');

    Note: 如果未指定user,则在启动Greenplum数据库时,dblink_connect_u()将使用PGUSER环境变量的值。 如果未设置PGUSER,则默认值为启动Greenplum数据库的系统用户。

  3. test_user可以使用dblink()函数通过dblink连接执行查询。 例如,此命令使用在上一步中创建的名为testconn的dblink连接。 test_user必须具有对该表的适当访问权限。

    1. testdb=> SELECT * FROM dblink('testconn', 'SELECT * FROM testdblink') AS dbltab(id int, product text);

附加模块文档

有关此模块中各个函数的详细信息,请参考PostgreSQL文档中的dblink