dblink函数

dblink函数

dblink模块被提供用来轻松地建立与位于同一数据库主机或者远程主机上的其他数据库之间的连接。dblink被用于让数据库用户在其他数据库中执行短小的临时查询。dblink并非作为临时表或者gptransfer等管理工具的替代品而设计。

下列过程展示了在Greenplum数据库中配置和使用dblink的基本步骤。更多关于其函数的信息可见PostgreSQL文档中的dblink部分。

  1. 从创建一个将用dblink功能查询的示例表开始。这些命令会在postgres数据库中创建一个小表,后面用户将从gpadmin数据库中使用 dblink查询它:
    $ psql -d postgres
    psql (8.3.23)
    Type "help" for help.
    
    postgres=# CREATE TABLE testdblink (a int, b text) DISTRIBUTED BY (a);
    CREATE TABLE
    postgres=# INSERT INTO testdblink VALUES (1, 'Cheese');
    INSERT 0 1
    postgres=# INSERT INTO testdblink VALUES (2, 'Fish');
    INSERT 0 1
    postgres=# \q
    $
  2. 登入一个不同的数据库(在这个例子中是gpadmin)并且安装dblink函数(如果它们还没有被安装)。用户将使用$GPHOME/share/postgresql/contrib/dblink.sql脚本安装dblink函数:
    $ psql -d gpadmin
    psql (8.3.23)
    Type "help" for help.
    
    gpadmin=# \i /usr/local/gpdb/share/postgresql/contrib/dblink.sql
    SET
    CREATE FUNCTION
    CREATE FUNCTION
    CREATE FUNCTION
    CREATE FUNCTION
    REVOKE
    REVOKE
    CREATE FUNCTION
    CREATE FUNCTION
    ...
  3. 使用dblink_connect函数创建到其他数据库的隐式连接和命名连接。用户提供的连接串应该是一个libpq样式的键/值串。例如,要在本地Greenplum数据库系统上创建一个到postgres数据库的命名连接:
    gpadmin=# SELECT dblink_connect('mylocalconn', 'dbname=postgres');
     dblink_connect
    ----------------
     OK
    (1 row)
    要建立一个到远程数据库系统的连接,只需要在连接串中简单地包括主机和端口信息。例如,要创建一个到远程系统的隐式dblink连接:
    gpadmin=# SELECT dblink_connect('host=remotehost port=5432 dbname=postgres');
  4. 使用基本dblink函数使用一个配置好的连接来查询一个数据库。记住dblink函数会返回一个记录类型,这样用户必须指定dblink查询中返回的列。例如,下面的命令使用命名连接来查询用户在步骤1中创建的表:
    gpadmin=# SELECT * FROM dblink('mylocalconn', 'SELECT * FROM testdblink') AS dbltab(id int, product text);
     id | product
    ----+---------
      1 | Cheese
      2 | Fish
    (2 rows)
    在这个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