PostgreSQL 安裝過程語言

2021-09-03 16:51 更新

在每一個要使用過程語言的數(shù)據(jù)庫中都必須安裝相應(yīng)的過程語言。不過安裝在數(shù)據(jù)庫template1中的過程語言會被后續(xù)創(chuàng)建的數(shù)據(jù)庫自動繼承,因為template1中與過程語言相關(guān)的項會被CREATE DATABASE復(fù)制。因此,數(shù)據(jù)庫管理員可以決定在哪些數(shù)據(jù)庫中可以使用哪些語言,并且按照選擇讓一些語言默認可用。

對于標準發(fā)布所提供的語言,只需要執(zhí)行CREATE EXTENSION language_name來把該語言安裝在當前數(shù)據(jù)庫中。 下文所述的手工過程主要是為了安裝沒有被包裝成擴展的語言。

手工安裝過程語言

安裝一個過程語言到一個數(shù)據(jù)庫中包括五個步驟,且必須由一個數(shù)據(jù)庫超級用戶來執(zhí)行。在大部分情況下,所需的 SQL 命令應(yīng)該被打包成一個擴展的安裝腳本,這樣可以用CREATE EXTENSION來執(zhí)行它們。

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

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

    CREATE FUNCTION handler_function_name()
        RETURNS language_handler
        AS 'path-to-shared-object'
        LANGUAGE C;
    

    特殊的返回類型language_handler告訴數(shù)據(jù)庫系統(tǒng),這個函數(shù)不返回已定義的SQL數(shù)據(jù)類型,并且不能直接在SQL語句中使用。

  3. 可選地,語言處理器能提供一個內(nèi)聯(lián)處理器函數(shù)來執(zhí)行用這種語言編寫的匿名代碼塊(DO命令)。如果該語言提供了一個內(nèi)聯(lián)函數(shù),用類似下面的命令聲明它

    CREATE FUNCTION inline_function_name(internal)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;
    

  4. 可選地,語言處理器能提供一個驗證器函數(shù)用來檢查一個函數(shù)定義的正確性而無需實際執(zhí)行它。如果驗證器函數(shù)存在,它將被CREATE FUNCTION調(diào)用。如果該語言提供了一個驗證器函數(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指定,如果用戶不具有訪問數(shù)據(jù)的權(quán)限,該語言不會授予對數(shù)據(jù)的訪問??尚诺恼Z言是為普通數(shù)據(jù)庫用戶(沒有超級用戶特權(quán))設(shè)計的并且允許他們安全地創(chuàng)建函數(shù)和過程。由于 PL 函數(shù)是在數(shù)據(jù)庫內(nèi)部執(zhí)行的,TRUSTED標志只應(yīng)被給予不允許訪問數(shù)據(jù)庫服務(wù)器內(nèi)部或文件系統(tǒng)的語言。語言 PL/pgSQL、 PL/Tcl以及 PL/Perl被認為是可信的,語言 PL/TclU、 PL/PerlU以及 PL/PythonU是被設(shè)計用來提供無限制功能的并且應(yīng)該被標記為可信。

例 41.1展示了手工安裝過程如何安裝語言PL/Perl

例 41.1. PL/Perl的手工安裝

下列命令告訴數(shù)據(jù)庫服務(wù)器在哪里尋找用于PL/Perl語言調(diào)用處理器函數(shù)的共享對象:

CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS
    '$libdir/plperl' LANGUAGE C;

PL/Perl有一個內(nèi)聯(lián)處理器函數(shù)和一個驗證器函數(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ù)會為語言屬性為plperl的函數(shù)及過程所調(diào)用。


在一個默認的PostgreSQL安裝中,用于PL/pgSQL語言的處理器會被編譯并且安裝到library目錄,此外PL/pgSQL語言本身會被安裝在所有的數(shù)據(jù)庫中。如果配置了Tcl支持,用于 PL/TclPL/TclU的處理器會被編譯并且安裝到庫目錄中,但語言本身默認不會被安裝在任何數(shù)據(jù)庫中。同樣地,PL/PerlPL/PerlU處理器在配置了 Perl 支持時被編譯和安裝,并且PL/PythonU處理器在配置了 Python 支持時被安裝,但是這些語言默認都不會被安裝。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號