W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
通常,PL/Perl 被作為一種“可信的”編程語言安裝,其名稱 為plperl
。在這種設(shè)置下,為了保持安全性禁用了某些 Perl 操作。一般來說,被限制的操作是那些與環(huán)境交互的操作。它們 包括文件處理操作、require
以及 use
(外部模塊)。沒有辦法像
C 函數(shù)那樣訪問 數(shù)據(jù)庫服務(wù)器進程的內(nèi)部或者用服務(wù)器進程的權(quán)限得到 OS 級別的訪問。 因此,任何沒有特權(quán)的數(shù)據(jù)庫用戶也被允許使用這種語言。
下面例子中的函數(shù)將無法工作,因為出于安全原因不允許它做文件操作:
CREATE FUNCTION badfunc() RETURNS integer AS $$
my $tmpfile = "/tmp/badfile";
open my $fh, '>', $tmpfile
or elog(ERROR, qq{could not open the file "$tmpfile": $!});
print $fh "Testing writing to a file\n";
close $fh or elog(ERROR, qq{could not close the file "$tmpfile": $!});
return 1;
$$ LANGUAGE plperl;
這個函數(shù)的創(chuàng)建會失敗,因為驗證器會捕捉到它使用了禁用的操作。
有些時候需要編寫不受限制的 Perl 函數(shù)。例如,我們可能想要一個能發(fā)送 電子郵件的 Perl 函數(shù)。要處理這些情況,可以把 PL/Perl 安裝成一種 “不可信的”語言(通常被稱作 PL/PerlU
)。 在這種情況下整個 Perl 語言的特性都可以使用。在安裝語言時,用語言 名稱plperlu
將會選擇不可信的 PL/Perl 變體。
PL/PerlU函數(shù)的編寫者必須注意該函數(shù)不能被用來做 其設(shè)計目的之外的事情,因為該函數(shù)能做一個作為數(shù)據(jù)庫管理員登錄的用戶 可以做的任何事情。注意數(shù)據(jù)庫系統(tǒng)只允許數(shù)據(jù)庫超級用戶用不可信語言 創(chuàng)建函數(shù)。
如果上述函數(shù)是一個超級用戶用語言plperlu
創(chuàng)建的,則可以 執(zhí)行成功。
以和plperl
語言同樣的方式,可以用plperlu
編寫 Perl 中的匿名代碼塊,這樣的代碼塊能夠使用受限的操作,不過調(diào)用 者必須是超級用戶。
雖然對每個 SQL 角色會在一個獨立的 Perl 解釋器中運行 PL/Perl函數(shù),但是在一個給定會話中執(zhí)行的所有 PL/PerlU函數(shù)都運行在一個 Perl 解釋器中(與用于 任何PL/Perl函數(shù)的解釋器不同)。這允許 PL/PerlU函數(shù)自由地共享數(shù)據(jù),但是 PL/Perl和PL/PerlU函數(shù)之間不會 發(fā)生任何交流。
Perl 不支持一個進程中的多個解釋器,除非編譯它時使用了合適的標志, 即usemultiplicity
或者useithreads
( usemultiplicity
會更好,除非你確實需要使用線程。更多細節(jié), 請見perlembed手冊頁)。
如果PL/Perl用的是一份沒有這樣編譯的 Perl 拷貝,那么 在每個會話中只能有一個 Perl 解釋器,并且因此任一會話只能要么執(zhí)行 PL/PerlU函數(shù),要么執(zhí)行同一個 SQL 角色調(diào)用的 PL/Perl函數(shù)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: