39.4. 可信的和不可信的 PL/Perl

通常,PL/Perl 是作為一種叫 plperl"可信的"編程語言安裝的。 在這種設置中,為了保持安全,某些 Perl 操作被關閉掉了。通常, 受限制的操作都是那些和環境相互交互的動作。這包括文件句柄操作, require,和 use(對于外部模塊)。 我們沒有辦法訪問數據庫服務器進程內部或者獲取具有服務器進程權限的 OS 級別的訪問,就像 C 函數那樣。 因此,任何非特權的數據庫用戶都可以允許使用這種語言。

這裡是一個無法運轉的函數的例子,因為出于安全原因, 文件系統的操作是不允許的:

CREATE FUNCTION badfunc() RETURNS integer AS '
    open(TEMP, ">/tmp/badfile");
    print TEMP "Gotcha!\n";
    return 1;
' LANGUAGE plperl;

這個函數的創建是可以的,但是不能執行它。

有時候我們想寫不受限制的 Perl 函數。比如,我們可能需要一個能發送郵件的 Perl 函數。 為了處理這種情況,PL/Perl 也可以安裝為"不可信"的語言(通常叫做 PL/PerlU)。 在這種情況下,我們可以使用完整的 Perl 語言。如果用 createlang 安裝該語言,那麼用 plperlu 這個名字可以選取不可信的 PL/Perl 變種。

PL/PerlU 函數的作者必須注意不能把該函數用于做任何不想做的事情, 因為它可以幹任何以數據庫管理員身份登錄的用戶能幹的事情。 請注意數據庫系統只允許數據庫超級用戶創建不可信語言寫的函數。

如果上面的函數由超級用戶用 plperlu 創建,那麼執行就會成功。