dblink
dblink
dblink模块支持从数据库会话中连接到其他Greenplum数据库数据库。 这些数据库可以驻留在相同的Greenplum数据库系统中,也可以驻留在远程系统中。
Greenplum数据库支持Greenplum数据库安装中具有相同主要版本号的数据库之间的dblink连接。 您还可以使用dblink连接到使用兼容libpq库的其他Greenplum数据库安装。
Greenplum数据库dblink模块是PostgreSQL dblink模块的修改版本。 在Greenplum数据库中使用该模块时,存在一些限制。
安装和注册模块
当您安装Greenplum数据库时,将安装dblink模块。 在使用模块中定义的任何函数之前,必须在要使用这些函数的每个数据库中注册dblink扩展。
Greenplum数据库注意事项
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_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');
testdb=# SELECT dblink_connect('host=remotehost port=5432 dbname=postgres user=gpadmin password=secret');
作为非超级用户使用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权限授予被认为可信任的特定用户可能是适当的,但是应格外小心。
同样,即使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。