?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE name CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
CREATE LANGUAGE通過一個(gè)PostgreSQL 數(shù)據(jù)庫注冊了一個(gè)新的程序語言。后來,函數(shù)和觸發(fā)器程序可以通過這個(gè)新語言定義。
CREATE LANGUAGE有效地用處理程序函數(shù)關(guān)聯(lián)語言名稱,其中 這些處理程序函數(shù)是負(fù)責(zé)執(zhí)行用該語言寫的函數(shù)的。參考Chapter 49 獲取更多關(guān)于語言處理程序的信息。
有兩種形式的CREATE LANGUAGE命令。第一種形式, 用戶只提供需要的語言的名字,然后PostgreSQL 服務(wù)器參考pg_pltemplate 系統(tǒng)表來判斷正確的參數(shù)。第二種形式,用戶把語言參數(shù)和語言名字一起提供。 第二種形式可以用于創(chuàng)建沒有在pg_pltemplate里面定義的語言, 不過這種方法被認(rèn)為已經(jīng)過時(shí)了。
如果服務(wù)器在pg_pltemplate系統(tǒng)表里面找到給出的語言名字 的紀(jì)錄,那么它將使用系統(tǒng)表的數(shù)據(jù),即使命令包含語言參數(shù)也如此。 這個(gè)行為簡化了加載舊的轉(zhuǎn)儲文件的過程,因?yàn)檫@些轉(zhuǎn)儲文件很可能包含有關(guān) 語言支持函數(shù)的過時(shí)信息。
通常地,用戶必須有PostgreSQL超級用戶權(quán)限 來注冊一個(gè)新語言。然而,數(shù)據(jù)庫的所有者能在那個(gè)數(shù)據(jù)庫內(nèi)注冊一個(gè)新語言, 若該語言被列入pg_pltemplate目錄并被標(biāo)記為 允許被數(shù)據(jù)庫所有者創(chuàng)建(tmpldbacreate為真)。默認(rèn)是 信任的語言可以通過數(shù)據(jù)庫所有者來創(chuàng)建,但這可以被超級用戶通過更改 pg_pltemplate的內(nèi)容來調(diào)整。一個(gè)語言的創(chuàng)建者 變成了其所有者并且可以刪除它、重命名它或者將它分配給一個(gè)新的所有者。
CREATE OR REPLACE LANGUAGE將會(huì)要么創(chuàng)建一個(gè)新語言要么替代 一個(gè)已有定義。如果語言已經(jīng)存在,它的參數(shù)會(huì)根據(jù)來自pg_pltemplate 的值來更新,但是語言的所屬關(guān)系和許可設(shè)置不會(huì)更改,并且任何用該語言寫的程序 都假定為仍然有效。除了請求創(chuàng)建一種語言的常規(guī)權(quán)限,要獲得其他權(quán)限用戶必須是 現(xiàn)有語言的超級用戶或者所有者。REPLACE主要是用來確保語言存在的。 若語言有pg_pltemplate條目,那么 pg_pltemplate實(shí)際上并不能改變?nèi)魏维F(xiàn)有的定義,除了在 不尋常的情況下,像pg_pltemplate條目在語言創(chuàng)建后被更改。
TRUSTED說明對該語言的調(diào)用處理器是安全的; 也就是說,它不會(huì)提供給非特權(quán)用戶任何繞過訪問限制的能力。如果 忽略這個(gè)關(guān)鍵字,只有PostgreSQL超級 用戶可以使用這個(gè)語言創(chuàng)建新函數(shù)。
這是個(gè)沒有用的字
新過程語言的名稱。語言名是大小寫無關(guān)的。這個(gè)名字應(yīng)該在數(shù)據(jù)庫 的所有語言中唯一。
出于向下兼容的原因,這個(gè)名字可以用單引號包圍。
call_handler是 一個(gè)以前注冊過的函數(shù)名字,該函數(shù)將被用來執(zhí)行該過程語言的函數(shù)。 過程語言的調(diào)用處理器必須用一種編譯語言(比如 C)書寫,調(diào)用風(fēng)格 必須是版本-1 的調(diào)用風(fēng)格,并且注冊為不接受參數(shù)并且返回 language_handler類型的函數(shù)。language_handler 是用于將函數(shù)聲明為調(diào)用處理器的占位符。
inline_handler是一個(gè)先前 已注冊的函數(shù)的名稱,且該函數(shù)將會(huì)通過該語言被調(diào)用來執(zhí)行一個(gè)匿名代碼塊 (DO命令)。若未指定 inline_handler函數(shù),那么該 語言將不支持匿名代碼塊。處理程序函數(shù)必須帶有internal類型 參數(shù),這將會(huì)作為DO命令的內(nèi)部表征,并且通常會(huì)返回void。 忽略處理程序的返回值會(huì)。
valfunction是一個(gè) 以前注冊過的函數(shù)名字,在用該語言創(chuàng)建新函數(shù)的時(shí)候?qū)⒂盟鼇硇r?yàn)新函數(shù)。 如果沒有聲明校驗(yàn)函數(shù),那么建立新函數(shù)的時(shí)候就不會(huì)檢查它。校驗(yàn)函數(shù)必 須接受一個(gè)類型為oid的參數(shù),它是將要?jiǎng)?chuàng)建的函數(shù)的 OID , 并且通常會(huì)返回void。
校驗(yàn)函數(shù)通常會(huì)檢查函數(shù)體,看看有沒有語法錯(cuò)誤,但是它也可以查看函數(shù)
的其它屬性,比如該語言是否不能處理某種參數(shù)類型。校驗(yàn)函數(shù)應(yīng)該用
ereport()
函數(shù)報(bào)告錯(cuò)誤。該函數(shù)的返回值將被忽略。
如果服務(wù)器在pg_pltemplate系統(tǒng)表里有對應(yīng)名稱的語言紀(jì)錄, 那么TRUSTED選項(xiàng)和支持函數(shù)的名字等參數(shù)將被忽略。
createlang程序是對CREATE LANGUAGE命令的 一個(gè)簡單封裝。降低了在 shell 命令行上安裝過程語言的難度
使用DROP LANGUAGE命令,或者更好是 droplang程序來刪除一個(gè)過程語言。
系統(tǒng)表pg_language
(參閱節(jié)
Section 45.24)記錄了更多有關(guān)當(dāng)前安裝
的過程語言的信息。createlang也有一個(gè)選項(xiàng)
列出已安裝的語言。
要使用一種過程語言創(chuàng)建函數(shù),用戶必須對該語言有USAGE 權(quán)限。缺省時(shí),對于可信的語言,USAGE是賦與PUBLIC (也就是每個(gè)人)的。需要時(shí),這個(gè)權(quán)限可以撤銷。
過程語言是對每個(gè)獨(dú)立數(shù)據(jù)庫本地創(chuàng)建的。不過,語言可以安裝到 template1里面,這樣就會(huì)導(dǎo)致它自動(dòng)在所有 隨后創(chuàng)建的數(shù)據(jù)庫里可用。
調(diào)用處理程序函數(shù),內(nèi)聯(lián)處理函數(shù)(若存在),以及驗(yàn)證器函數(shù)(若存在)必須是 已存在的,若服務(wù)器在pg_pltemplate中沒有語言的記錄。 但是當(dāng)有一條記錄時(shí),這個(gè)函數(shù)不需要提前存在;若不在數(shù)據(jù)庫中,這些函數(shù)將會(huì) 被自動(dòng)定義。(若實(shí)現(xiàn)語言的共享庫不出現(xiàn)在安裝過程中,這會(huì)導(dǎo)致 CREATE LANGUAGE失敗。)
在PostgreSQL之前,必須聲明處理器函數(shù) 返回占位類型opaque,而不是language_handler。 為了支持加載舊的轉(zhuǎn)儲文件,CREATE LANGUAGE還將接受聲明 為返回opaque的函數(shù),但是它會(huì)發(fā)出一條通知并且把函數(shù)的返回 類型改為language_handler。
創(chuàng)建標(biāo)準(zhǔn)的過程語言的比較好的方法:
CREATE LANGUAGE plperl;
對于pg_pltemplate還不知道的語言,需要下面這樣的序列:
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
CREATE LANGUAGE是PostgreSQL擴(kuò)展