使用“ plperl”通过plperl pg_available_extensions

问题描述

我想使用“ plperl”从Postgresql过程/函数调用RESTful Web服务。 我不能使用plperlu,plpython2u,JOOQ或Hibernate。

因此,我想使用以下网站中的“ plperlu” Postgresql-proc示例中的“类似”内容,但对于plperl(或类似“不是” plperlu,“不是” plpython2u,“不是” JOOQ的plperl之类的东西)和“非”休眠): Calling RESTful Web Services from PostgreSQL procedure/function

我尝试了以下代码,但不适用于plperl,因为它可能仅适用于plperlu,不适用于plperl(但我没有办法让AWS在我的AWS-Postgresql-RDS上安装plperlu):

CREATE OR REPLACE FUNCTION restful.get()
RETURNS text
LANGUAGE plperl
Security DEFINER
AS $function$
use REST::Client;
use Encode qw(encode);
my $client = REST::Client->new(); 
$client->getUseragent()->proxy( 'https','https://xdmactive.maxarmdm.com:8443/semarchy/api/rest/query/test/test' ); -- # use4 proxy authentication
$client->addHeader('Content-Type','application/json');  --   # headers
$client->addHeader('Api-Key','9Yw_jmh.ey3rUlkzjsdueliokT1A_kh');  # headers
$client->GET('https://xdmactive.maxarmdm.com:8443/semarchy/api/rest/query/test/test'); -- # encoding
return $client->responseContent();
$function$

这是我得到的错误,它看起来像“也许”是权限错误(但可能是plperl vs plperlu): sql错误[42601]:错误:无法在第2行将REST / Client.pm加载到plperl中。 BEGIN失败-编译在第2行中止。 其中:PL / Perl函数“ get”的编译

以下是我可以在我的AWS-Postgresql-RDS中使用的所有“ pg_available_extensions”列表:

address_standardizer,address_standardizer_data_us,amcheck,apg_plan_mgmt,aurora_stat_utils,aws_commons,aws_ml,aws_s3,bloom,btree_gin,btree_gist,citext,cube,dblink,dict_int,dict_xsyn,earthdistance,fuzzystrmatch,hll,hstore,hstore_plperl,intagg,intarray,ip4r,isn,jsonb_plperl,log_fdw,ltree,orafce,pg_buffercache,pg_freespacemap
pg_hint_plan
pg_prewarm
pg_repack
pg_similarity
pg_stat_statements
pg_trgm
pg_visibility
pgaudit
pgcrypto
pgrouting
pgrowlocks
pgstattuple
pgtap
plcoffee
plls
plperl
plpgsql
plprofiler
pltcl
plv8
postgis
postgis_tiger_geocoder
postgis_topology
postgres_fdw
prefix
rds_activity_stream
sslinfo
tablefunc
test_parser
tsm_system_rows
tsm_system_time
unaccent
uuid-ossp

解决方法

加载模块需要从磁盘读取实现该模块的文件。受信任的pl语言无法从磁盘读取,这是受信任的语言的主要内容之一。

您可以在代码切换到信任模式之前预读文件,从而有效地将模块列入白名单。

plperl.on_init='require REST::Client;'

但是让RDS允许您执行此操作的机会非常低,原因与之相同,因为它们不允许您首先使用不受信任的pl语言。

总体而言,托管产品不允许您执行自己想做的事情的唯一解决方案是不使用它们。