PostgreSQL CREATE LANGUAGE

2021-09-09 11:22 更新

CREATE LANGUAGE — 定義一種新的過程語言

大綱

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
    HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name

描述

CREATE LANGUAGE為一個 PostgreSQL數(shù)據(jù)庫注冊一種新的 過程語言。接著,可以用這種新語言定義函數(shù)和存儲過程。

CREATE LANGUAGE實際上把該語言名稱與 負(fù)責(zé)執(zhí)行用該語言編寫的函數(shù)的處理器函數(shù)關(guān)聯(lián)在一起。有關(guān)語言處理器的 更多信息可以參考第 55 章。

CREATE OR REPLACE LANGUAGE將創(chuàng)建 或者替換一種現(xiàn)有的定義。如果該語言已經(jīng)存在,其參數(shù)會被根據(jù)命令更新。但 該語言的擁有關(guān)系和權(quán)限設(shè)置不會更改,并且任何已有的用該語言編寫的 函數(shù)仍然被假定有效。

必須具有PostgreSQL超級用戶權(quán)限才能注冊新語言或更改現(xiàn)有語言的參數(shù)。 然而,一旦語言被創(chuàng)建,將它的所有權(quán)分配給非超級用戶是有效的,然后他可以刪除它、更改其權(quán)限、重命名它或 將其分配給新的所有者。(但是,不要將底層 C 函數(shù)的所有權(quán)分配給非超級用戶;這會為該用戶創(chuàng)建權(quán)限提升路徑。)

不提供任何處理函數(shù)的CREATE LANGUAGE形式已過時。 為了向后兼容舊的轉(zhuǎn)儲文件,它被解釋為CREATE EXTENSION。 如果語言被打包到同名的擴(kuò)展中,這將起作用,這是設(shè)置過程語言的傳統(tǒng)方式。

參數(shù)

TRUSTED

TRUSTED指定該語言不會授予用戶不該具有的 數(shù)據(jù)訪問。如果在注冊語言時這個關(guān)鍵詞被省略,只有具有 PostgreSQL超級用戶特權(quán)的用戶才能 使用該語言創(chuàng)建新函數(shù)。

PROCEDURAL

這是一個噪聲詞。

name

新過程語言的名稱。該名稱必須在該數(shù)據(jù)庫的語言中唯一。

為了向后兼容,名稱可以用單引號圍繞。

HANDLER call_handler

call_handler 是一個之前注冊的函數(shù)的名稱,它將被調(diào)用來執(zhí)行該過程語言的函數(shù)。 一種過程語言的調(diào)用處理器必須以一種編譯型語言(如 C)編寫并且 具有版本 1 的調(diào)用約定,它必須在 PostgreSQL內(nèi)注冊為一個沒有 參數(shù)并且返回language_handler類型的函數(shù)。 language_handler是一種占位符類型, 它被用來 標(biāo)識該函數(shù)為一個調(diào)用處理器。

INLINE inline_handler

inline_handler 是一個之前注冊的函數(shù)的名稱,它將被調(diào)用來執(zhí)行一個該語言的匿名代碼塊( DO命令)。如果沒有指定 inline_handler函數(shù),則 該語言不支持匿名代碼塊。該處理器函數(shù)必須接受一個 internal類型的參數(shù),該參數(shù)將是DO命令的內(nèi)部表示,而且它通常 將返回void。該處理器的返回值會被忽略。

VALIDATOR valfunction

valfunction is the 是一個之前注冊的函數(shù)的名稱,當(dāng)一個該語言的新函數(shù)被創(chuàng)建時會調(diào)用該函數(shù)來 驗證新函數(shù)。如果沒有指定驗證器函數(shù),那么一個新函數(shù)被創(chuàng)建時不會被檢查。 驗證器函數(shù)必須接受一個oid類型的參數(shù),它將是要被創(chuàng)建的 函數(shù)的 OID,而且它通常將返回void。

一個驗證器函數(shù)通常會檢查函數(shù)體中的語法正確性,但是它也能查看函數(shù)的其他 屬性,例如該語言能否處理特定的參數(shù)類型。為了發(fā)出一個錯誤,驗證器函數(shù)應(yīng)該 使用ereport()函數(shù)。驗證器函數(shù)的返回值會被忽略。

注解

使用DROP LANGUAGE刪除過程語言。

系統(tǒng)目錄pg_language(見第 51.29 節(jié))記錄著有關(guān)當(dāng)前已安裝的語言的信息。 還有,psql命令\dL列出已安裝的語言。

要以一種過程語言創(chuàng)建函數(shù),用戶必須具有對于該語言的 USAGE特權(quán)。默認(rèn)情況下,對于可信語言, USAGE被授予給PUBLIC(即所有人)。 如果需要可以將它收回。

過程語言對于單個數(shù)據(jù)庫來說是本地的。但是,一種語言可以被安裝在 template1數(shù)據(jù)庫中,這會導(dǎo)致它在所有后續(xù)創(chuàng)建的 數(shù)據(jù)庫中自動變得可用。

示例

創(chuàng)建新的過程語言的最小順序是:

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
    AS '$libdir/plsample'
    LANGUAGE C;
CREATE LANGUAGE plsample
    HANDLER plsample_call_handler;

通常這會寫在擴(kuò)展的創(chuàng)建腳本中,用戶會這樣做來安裝擴(kuò)展:

CREATE EXTENSION plsample;

兼容性

CREATE LANGUAGE是一種 PostgreSQL擴(kuò)展。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號