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。