PostgreSQL 安裝過(guò)程語(yǔ)言

2021-09-03 16:51 更新

在每一個(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í)行它們。

  1. 用于語(yǔ)言處理器的共享對(duì)象必須被編譯并安裝到一個(gè)合適的庫(kù)目錄中。這和編譯和安裝常規(guī)的用戶定義 C 函數(shù)一樣,參見(jiàn)第 37.10.5 節(jié)。通常,語(yǔ)言處理器將依賴于一個(gè)實(shí)際提供編程語(yǔ)言引擎的外部庫(kù),如果是這樣,那些外部庫(kù)也應(yīng)該被安裝。

  2. 處理器必須用下面的命令聲明

    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ǔ)句中使用。

  3. 可選地,語(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;
    

  4. 可選地,語(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;
    

  5. 最后,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/TclPL/TclU的處理器會(huì)被編譯并且安裝到庫(kù)目錄中,但語(yǔ)言本身默認(rèn)不會(huì)被安裝在任何數(shù)據(jù)庫(kù)中。同樣地,PL/PerlPL/PerlU處理器在配置了 Perl 支持時(shí)被編譯和安裝,并且PL/PythonU處理器在配置了 Python 支持時(shí)被安裝,但是這些語(yǔ)言默認(rèn)都不會(huì)被安裝。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)