定义基于命令的可写外部表
定义基于命令的可写外部表¶
用户可以定义可写的外部表把表数据发送到一个应用或者脚本。该应用必须接受一个输入流、在所有的SeaboxMPP的executor主机上位于相同位置并且对seabox
用户可执行。SeaboxMPP系统中的所有executor都运行该应用或者脚本,不管executor有没有输出行需要处理。
使用CREATE FOREIGN TABLE
来定义外部表并且制定在executor主机上运行的应用或者脚本。命令从数据库内部执行并且不能访问环境变量(例如$PATH
)。在用户的可写外部表定义的EXECUTE
子句中设置环境变量。例如:
create server execout foreign data wrapper execute_fdw;
create user mapping for public server execout;
create foreign table execout_table(like orders) server execout options(commands 'cat >/dev/null', format 'csv', is_writable 'true');
insert into execout_table select * from orders_fdw;
copy orders_fdw to program 'cat >@tempdir@/orders_fdw.out' (format 'csv', delimiter ',');
下面的SeaboxMPP数据库变量可以用在一个Web或者可写外部表所执行的OS命令中。把这些变量设置为执行命令的shell中的环境变量。它们可以被用来标识外部表语句在SeaboxMPP数据库的主机和executor实例阵列之间所作的一个要求集合。
表 外部表EXECUTE变量
变量 | 描述 |
---|---|
$SC_CID | 执行外部表命令的事务的命令计数。 |
$SC_DATABASE | 外部表定义所在的数据库。 |
$SC_DATE | 外部表命令被运行的日期。 |
$SC_MASTER_HOST | 分派外部表语句的SeaboxMPP的Coordinator主机的主机名。 |
$SC_MASTER_PORT | 分派外部表语句的SeaboxMPP的Coordinator主机的端口号。 |
$SC_QUERY_STRING | SeaboxMPP数据库执行的SQL命令(DML或SQL查询)。 |
$SC_SEG_DATADIR | 执行外部表命令的executor实例的数据目录的位置。 |
$SC_SEG_PG_CONF | 执行外部表命令的executor实例的seaboxsql.conf文件的位置。 |
$SC_SEG_PORT | 执行外部表命令的executor的端口号。 |
$SC_SEGMENT_COUNT | SeaboxMPP数据库系统中主要executor实例的总数。 |
$SC_SEGMENT_ID | 执行外部表命令的executor实例的ID号(与sc_node_configuration 中的dbid 一样)。 |
$SC_SESSION_ID | 与外部表语句相关的数据库会话标识号。 |
$SC_SN | 外部表语句执行计划中外部表扫描节点的序号。 |
$SC_TIME | 外部表命令被执行的时间。 |
$SC_USER | 执行外部表语句的用户。 |
$SC_XID | 外部表语句的事务ID。 |