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()函数中提供连接字符串。例如:
gpadmin=# CREATE TABLE testdbllocal (a int, b text) DISTRIBUTED BY (a);
CREATE TABLE
gpadmin=# INSERT INTO testdbllocal select * FROM dblink('dbname=postgres', 'SELECT * FROM testdblink') AS dbltab(id int, product text);
INSERT 0 2
dblink的Greenplum数据库版本禁用以下异步函数:
- dblink_send_query()
- dblink_is_busy()
- dblink_get_result()
使用dblink
以下过程确定了在Greenplum数据库中配置和使用dblink的基本步骤。 这些示例使用dblink_connect()创建与数据库的连接,并使用dblink()执行SQL查询。
首先创建一个示例表以使用dblink函数进行查询。 这些命令在postgres数据库中创建一个小表,稍后您将使用dblink从testdb数据库中查询该表:
$ psql -d postgres
psql (9.4.20)
Type "help" for help.
postgres=# CREATE TABLE testdblink (a int, b text) DISTRIBUTED BY (a);
CREATE TABLE
postgres=# INSERT INTO testdblink VALUES (1, 'Cheese'), (2, 'Fish');
INSERT 0 2
postgres=# \q
$
以超级用户身份登录到另一个数据库。 在此示例中,超级用户gpadmin登录到数据库testdb。 如果dblink函数尚不可用,请在数据库中注册dblink扩展:
$ psql -d testdb
psql (9.4beta1)
Type "help" for help.
testdb=# CREATE EXTENSION dblink;
CREATE EXTENSION
使用dblink_connect()函数创建与另一个数据库的隐式或命名连接。 您提供的连接字符串应该是libpq样式的关键字/值字符串。 本示例创建一个名为mylocalconn的连接到本地Greenplum数据库系统上的postgres数据库:
testdb=# SELECT dblink_connect('mylocalconn', 'dbname=postgres user=gpadmin');
dblink_connect
----------------
OK
(1 row)
Note: 如果未指定user,则在启动Greenplum数据库时,dblink_connect()将使用PGUSER环境变量的值。 如果未设置PGUSER,则默认值为启动Greenplum数据库的系统用户。
使用dblink()函数可使用已配置的连接查询数据库。 请记住,此函数返回记录类型,因此您必须分配dblink()查询中返回的列。 例如,以下命令使用命名连接来查询您先前创建的表:
testdb=# SELECT * FROM dblink('mylocalconn', 'SELECT * FROM testdblink') AS dbltab(id int, product text);
id | product
----+---------
1 | Cheese
2 | Fish
(2 rows)
要以另一个用户身份连接到本地数据库,请在连接字符串中指定该用户。 本示例以用户test_user的身份连接到数据库。 使用dblink_connect(),超级用户无需指定密码即可创建与另一个本地数据库的连接。
testdb=# SELECT dblink_connect('localconn2', 'dbname=postgres user=test_user');
要建立与远程数据库系统的连接,请在连接字符串中包含主机和密码信息。 例如,要创建到远程系统的隐式dblink连接:
testdb=# SELECT dblink_connect('host=remotehost port=5432 dbname=postgres user=gpadmin password=secret');
作为非超级用户使用dblink
要使用dblink_connect()与数据库建立连接,非超级用户必须在连接字符串中包含主机,用户和密码信息。 即使连接到本地数据库,也必须包括主机,用户和密码信息。 例如,用户test_user可以使用以下命令创建到本地系统mdw的dblink连接:
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文件都不要包含任何指定通配符主机名的记录。
作为超级用户,对用户数据库中的dblink_connect_u()函数授予EXECUTE特权。 本示例向具有创建隐式或命名dblink连接的签名的函数的非超级用户test_user授予特权。
testdb=# GRANT EXECUTE ON FUNCTION dblink_connect_u(text) TO test_user;
testdb=# GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO test_user;
现在,test_user无需密码即可创建到另一个本地数据库的连接。 例如,test_user可以登录到testdb数据库并执行此命令以创建一个名为testconn的连接到本地postgres数据库。
testdb=> SELECT dblink_connect_u('testconn', 'dbname=postgres user=test_user');
Note: 如果未指定user,则在启动Greenplum数据库时,dblink_connect_u()将使用PGUSER环境变量的值。 如果未设置PGUSER,则默认值为启动Greenplum数据库的系统用户。
test_user可以使用dblink()函数通过dblink连接执行查询。 例如,此命令使用在上一步中创建的名为testconn的dblink连接。 test_user必须具有对该表的适当访问权限。
testdb=> SELECT * FROM dblink('testconn', 'SELECT * FROM testdblink') AS dbltab(id int, product text);
附加模块文档
有关此模块中各个函数的详细信息,请参考PostgreSQL文档中的dblink。