Security

無法創建 perlplu 函式

  • March 31, 2013

在從儲存庫安裝的 Xubuntu 12.04 上執行 PostgreSQL 9.1.8。

在 shell 中,我執行了:

createlang plperl db_name;
createlang plperlu db_name;

作為超級使用者執行psql,我執行了:

GRANT ALL ON LANGUAGE plperl TO account_name;
GRANT ALL ON LANGUAGE plperlu TO account_name;

pg_language表顯示:

select lanname,lanpltrusted from pg_language where lanname like 'plperl%';

"plperl";t
"plperlu";t

當我創建以下函式時:

CREATE OR REPLACE FUNCTION get_hostname()
 RETURNS text AS
$BODY$
 use Sys::Hostname;
 return hostname;
$BODY$
 LANGUAGE plperlu IMMUTABLE
 COST 1;
ALTER FUNCTION get_hostname()
 OWNER TO account_name;

我收到以下錯誤:

ERROR:  Unable to load Sys/Hostname.pm into plperl at line 2.
BEGIN failed--compilation aborted at line 2.
CONTEXT:  compilation of PL/Perl function "get_hostname"

然而,以下工作:

CREATE OR REPLACE FUNCTION get_hostname()
 RETURNS text AS
$BODY$
 return '127.0.0.1';
$BODY$
 LANGUAGE plperlu IMMUTABLE
 COST 1;
ALTER FUNCTION get_hostname()
 OWNER TO account_name;

以下 Perl 腳本在 shell 中按預期工作:

use Sys::Hostname;
print hostname;

我嘗試將該函式作為匿名塊執行:

DO $$
 use Sys::Hostname;
 print hostname;
$$ LANGUAGE plperlu;

這返回了與以前相同的錯誤,並帶有以下附加資訊:

ERROR: Unable to load Sys/Hostname.pm into plperl at line 3.
BEGIN failed--compilation aborted at line 3.
SQL state: 42601
Context: PL/Perl anonymous code block

文件中,錯誤 42601 是語法錯誤。

我沒有看到語法錯誤。

此外,當我導入數據庫時,使用超級使用者帳戶載入的功能很好:

psql -d db_name -U account_name -W -f db-dump.sql > import.log 2> error.log

我試圖簡化程式碼無濟於事:

CREATE OR REPLACE FUNCTION get_hostname() RETURNS text AS
$$
 use Sys::Hostname;
 return hostname;
$$
LANGUAGE plperlu;

和以前一樣的錯誤。

我不明白的是,為什麼根據錯誤消息,PostgreSQL 試圖將程式碼載入到plperl而不是plperlu.

有任何想法嗎?

更新#1

請注意,postgres 使用者是超級使用者:

                            List of roles
Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
postgres  | Superuser, Create role, Create DB, Replication | {}

由於plperlu不受信任,該帳戶需要超級使用者授權:

DROP LANGUAGE plperl;
DROP LANGUAGE plperlu;
CREATE OR REPLACE TRUSTED LANGUAGE plperlu;
UPDATE pg_language set lanpltrusted = true where lanname='plperlu';
GRANT ALL ON LANGUAGE plperlu TO account_name WITH GRANT OPTION;
ALTER USER account_name WITH SUPERUSER;

我不知道是否允許同時安裝,所以我放棄了前者plperlplperlu現在可以創建該函式。

引用自:https://dba.stackexchange.com/questions/38922