Security
無法創建 perlplu 函式
在從儲存庫安裝的 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;
我不知道是否允許同時安裝,所以我放棄了前者
plperl
。plperlu
現在可以創建該函式。