使用一种自定协议

使用一种自定协议

Greenplum提供了诸如gpfdisthttp以及file等协议来通过网络访问数据,或者用户可以创作一个自定义协议。用户可以为自定义协议使用标准的数据格式TEXTCSV,或者使用一种自定义数据格式。

只要可用的内建协议无法满足一种特定需要,用户就可以创建一种自定义的协议。例如,如果用户需要并行地把Greenplum数据库直接连接到另一个系统,并且在两者之间发送数据流而无需在磁盘上物化系统数据或者使用gpfdist这样的中间进程。用户必须是超级用户才能创建和注册自定义协议。

  1. 用C语言和预定义的API创作发送、接受以及(可选的)验证器函数。这些函数会被编译并且注册在Greenplum数据库中。自定义协议的例子可见自定义数据访问协议实例
  2. 在编写并且编译读写函数到一个共享对象(.so)中之后,声明一个数据库函数指向该.so文件和函数名。

    下面的例子使用了编译好的导入和导出代码。

    CREATE FUNCTION myread() RETURNS integer
    as '$libdir/gpextprotocol.so', 'myprot_import'
    LANGUAGE C STABLE;
    CREATE FUNCTION mywrite() RETURNS integer
    as '$libdir/gpextprotocol.so', 'myprot_export'
    LANGUAGE C STABLE;
    

    可选函数的格式是:

    CREATE OR REPLACE FUNCTION myvalidate() RETURNS void 
    AS '$libdir/gpextprotocol.so', 'myprot_validate' 
    LANGUAGE C STABLE; 
    
  3. 创建一个访问这些函数的协议。Validatorfunc是可选的。
    CREATE TRUSTED PROTOCOL myprot(
    writefunc='mywrite',
    readfunc='myread', 
    validatorfunc='myvalidate');
  4. 必要时,把访问权限授予给任何其他用户。
    GRANT ALL ON PROTOCOL myprot TO otheruser;
    
  5. 在可读或可写外部表中使用该协议。
    CREATE WRITABLE EXTERNAL TABLE ext_sales(LIKE sales)
    LOCATION ('myprot://<meta>/<meta>/…')
    FORMAT 'TEXT';
    CREATE READABLE EXTERNAL TABLE ext_sales(LIKE sales)
    LOCATION('myprot://<meta>/<meta>/…')
    FORMAT 'TEXT';
    

用SQL命令CREATE TRUSTED PROTOCOL声明自定义协议,然后使用GRANT命令把访问权限授予给用户。例如:

  • 允许一个用户使用一种受信的协议创建一个可读的外部表
    GRANT SELECT ON PROTOCOL <protocol name> TO <user name>;
  • 允许一个用户使用一种受信的协议创建一个可写的外部表
    GRANT INSERT ON PROTOCOL <protocol name> TO <user name>;
  • 允许一个用户使用一种受信的协议创建一个可读写的外部表
    GRANT ALL ON PROTOCOL <protocol name> TO <user name>;