W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在每一個(gè)要使用過(guò)程語(yǔ)言的數(shù)據(jù)庫(kù)中都必須“安裝”相應(yīng)的過(guò)程語(yǔ)言。不過(guò)安裝在數(shù)據(jù)庫(kù)template1
中的過(guò)程語(yǔ)言會(huì)被后續(xù)創(chuàng)建的數(shù)據(jù)庫(kù)自動(dòng)繼承,因?yàn)?code class="literal">template1中與過(guò)程語(yǔ)言相關(guān)的項(xiàng)會(huì)被CREATE DATABASE
復(fù)制。因此,數(shù)據(jù)庫(kù)管理員可以決定在哪些數(shù)據(jù)庫(kù)中可以使用哪些語(yǔ)言,并且按照選擇讓一些語(yǔ)言默認(rèn)可用。
對(duì)于標(biāo)準(zhǔn)發(fā)布所提供的語(yǔ)言,只需要執(zhí)行CREATE EXTENSION
language_name
來(lái)把該語(yǔ)言安裝在當(dāng)前數(shù)據(jù)庫(kù)中。 下文所述的手工過(guò)程主要是為了安裝沒(méi)有被包裝成擴(kuò)展的語(yǔ)言。
手工安裝過(guò)程語(yǔ)言
安裝一個(gè)過(guò)程語(yǔ)言到一個(gè)數(shù)據(jù)庫(kù)中包括五個(gè)步驟,且必須由一個(gè)數(shù)據(jù)庫(kù)超級(jí)用戶來(lái)執(zhí)行。在大部分情況下,所需的 SQL 命令應(yīng)該被打包成一個(gè)“擴(kuò)展”的安裝腳本,這樣可以用CREATE EXTENSION
來(lái)執(zhí)行它們。
用于語(yǔ)言處理器的共享對(duì)象必須被編譯并安裝到一個(gè)合適的庫(kù)目錄中。這和編譯和安裝常規(guī)的用戶定義 C 函數(shù)一樣,參見(jiàn)第 37.10.5 節(jié)。通常,語(yǔ)言處理器將依賴于一個(gè)實(shí)際提供編程語(yǔ)言引擎的外部庫(kù),如果是這樣,那些外部庫(kù)也應(yīng)該被安裝。
處理器必須用下面的命令聲明
CREATE FUNCTION handler_function_name
()
RETURNS language_handler
AS 'path-to-shared-object
'
LANGUAGE C;
特殊的返回類型language_handler
告訴數(shù)據(jù)庫(kù)系統(tǒng),這個(gè)函數(shù)不返回已定義的SQL數(shù)據(jù)類型,并且不能直接在SQL語(yǔ)句中使用。
可選地,語(yǔ)言處理器能提供一個(gè)“內(nèi)聯(lián)”處理器函數(shù)來(lái)執(zhí)行用這種語(yǔ)言編寫的匿名代碼塊(DO命令)。如果該語(yǔ)言提供了一個(gè)內(nèi)聯(lián)函數(shù),用類似下面的命令聲明它
CREATE FUNCTION inline_function_name
(internal)
RETURNS void
AS 'path-to-shared-object
'
LANGUAGE C;
可選地,語(yǔ)言處理器能提供一個(gè)“驗(yàn)證器”函數(shù)用來(lái)檢查一個(gè)函數(shù)定義的正確性而無(wú)需實(shí)際執(zhí)行它。如果驗(yàn)證器函數(shù)存在,它將被CREATE FUNCTION
調(diào)用。如果該語(yǔ)言提供了一個(gè)驗(yàn)證器函數(shù),用類似下面的命令聲明它
CREATE FUNCTION validator_function_name
(oid)
RETURNS void
AS 'path-to-shared-object
'
LANGUAGE C STRICT;
最后,PL 必須用下面的命令聲明
CREATE [TRUSTED] LANGUAGE language_name
HANDLER handler_function_name
[INLINE inline_function_name
]
[VALIDATOR validator_function_name
] ;
可選的關(guān)鍵詞TRUSTED
指定,如果用戶不具有訪問(wèn)數(shù)據(jù)的權(quán)限,該語(yǔ)言不會(huì)授予對(duì)數(shù)據(jù)的訪問(wèn)??尚诺恼Z(yǔ)言是為普通數(shù)據(jù)庫(kù)用戶(沒(méi)有超級(jí)用戶特權(quán))設(shè)計(jì)的并且允許他們安全地創(chuàng)建函數(shù)和過(guò)程。由于 PL 函數(shù)是在數(shù)據(jù)庫(kù)內(nèi)部執(zhí)行的,TRUSTED
標(biāo)志只應(yīng)被給予不允許訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)器內(nèi)部或文件系統(tǒng)的語(yǔ)言。語(yǔ)言 PL/pgSQL、
PL/Tcl以及 PL/Perl被認(rèn)為是可信的,語(yǔ)言 PL/TclU、 PL/PerlU以及 PL/PythonU是被設(shè)計(jì)用來(lái)提供無(wú)限制功能的并且不應(yīng)該被標(biāo)記為可信。
例 41.1展示了手工安裝過(guò)程如何安裝語(yǔ)言PL/Perl。
例 41.1. PL/Perl的手工安裝
下列命令告訴數(shù)據(jù)庫(kù)服務(wù)器在哪里尋找用于PL/Perl語(yǔ)言調(diào)用處理器函數(shù)的共享對(duì)象:
CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS
'$libdir/plperl' LANGUAGE C;
PL/Perl有一個(gè)內(nèi)聯(lián)處理器函數(shù)和一個(gè)驗(yàn)證器函數(shù),因此我們也要聲明它們:
CREATE FUNCTION plperl_inline_handler(internal) RETURNS void AS
'$libdir/plperl' LANGUAGE C STRICT;
CREATE FUNCTION plperl_validator(oid) RETURNS void AS
'$libdir/plperl' LANGUAGE C STRICT;
命令
CREATE TRUSTED LANGUAGE plperl
HANDLER plperl_call_handler
INLINE plperl_inline_handler
VALIDATOR plperl_validator;
則定義了前面聲明的函數(shù)會(huì)為語(yǔ)言屬性為plperl
的函數(shù)及過(guò)程所調(diào)用。
在一個(gè)默認(rèn)的PostgreSQL安裝中,用于PL/pgSQL語(yǔ)言的處理器會(huì)被編譯并且安裝到“library”目錄,此外PL/pgSQL語(yǔ)言本身會(huì)被安裝在所有的數(shù)據(jù)庫(kù)中。如果配置了Tcl支持,用于 PL/Tcl和PL/TclU的處理器會(huì)被編譯并且安裝到庫(kù)目錄中,但語(yǔ)言本身默認(rèn)不會(huì)被安裝在任何數(shù)據(jù)庫(kù)中。同樣地,PL/Perl和PL/PerlU處理器在配置了 Perl 支持時(shí)被編譯和安裝,并且PL/PythonU處理器在配置了 Python 支持時(shí)被安裝,但是這些語(yǔ)言默認(rèn)都不會(huì)被安裝。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: