PostgreSQL CREATE EXTENSION

2021-09-09 10:28 更新

CREATE EXTENSION — 安裝一個(gè)擴(kuò)展

大綱

CREATE EXTENSION [ IF NOT EXISTS ] extension_name
    [ WITH ] [ SCHEMA schema_name ]
             [ VERSION version ]
             [ CASCADE ]

描述

CREATE EXTENSION把一個(gè)新的擴(kuò)展載入到 當(dāng)前數(shù)據(jù)庫(kù)中。不能有同名擴(kuò)展已經(jīng)被載入。

載入一個(gè)擴(kuò)展本質(zhì)上是運(yùn)行該擴(kuò)展的腳本文件。該腳本通常將創(chuàng)建新的 SQL對(duì)象,例如函數(shù)、數(shù)據(jù)類(lèi)型、操作符以及索引支持 方法。CREATE EXTENSION會(huì)額外地記錄 所有被創(chuàng)建對(duì)象的標(biāo)識(shí),這樣發(fā)出 DROP EXTENSION時(shí)可以刪除它們。

運(yùn)行CREATE EXTENSION的用戶(hù)成為擴(kuò)展的所有者, 以進(jìn)行以后的特權(quán)檢查,并且通常也成為由擴(kuò)展的腳本創(chuàng)建的任何對(duì)象的所有者。

通常,加載擴(kuò)展需要與創(chuàng)建擴(kuò)展組件對(duì)象所需的特權(quán)相同的特權(quán)。 對(duì)于許多擴(kuò)展,這意味著需要超級(jí)用戶(hù)特權(quán)。 但是,如果擴(kuò)展名在其控制文件中標(biāo)記為trusted,則該擴(kuò)展名可以由對(duì)當(dāng)前 數(shù)據(jù)庫(kù)具有CREATE特權(quán)的任何用戶(hù)安裝。 在這種情況下,擴(kuò)展對(duì)象本身將由主叫用戶(hù)擁有,但是包含的對(duì)象將由引導(dǎo)超級(jí)用戶(hù)擁有(除非擴(kuò)展的腳本將其明確分配給主叫用戶(hù))。 此配置使呼叫用戶(hù)有權(quán)刪除該擴(kuò)展名,但不能修改其中的單個(gè)對(duì)象。

參數(shù)

IF NOT EXISTS

已有同名擴(kuò)展存在時(shí)不要拋出錯(cuò)誤。這種情況下會(huì)發(fā)出一個(gè)提示。 注意,不保證現(xiàn)有的擴(kuò)展與將要從當(dāng)前可用的腳本文件創(chuàng)建的腳本 有任何相似。

extension_name

要安裝的擴(kuò)展的名稱(chēng)。PostgreSQL 將使用文件 SHAREDIR/extension/extension_name.control 中的指令來(lái)創(chuàng)建該擴(kuò)展。

schema_name

假定該擴(kuò)展允許其內(nèi)容被重定位,這是要在其中安裝該擴(kuò)展的對(duì)象的 模式名稱(chēng)。被提到的模式必須已經(jīng)存在。如果沒(méi)有指定并且該擴(kuò)展的 控制文件也沒(méi)有指定一個(gè)模式,將使用當(dāng)前的默認(rèn)對(duì)象創(chuàng)建模式。

如果該擴(kuò)展在其控制文件中指定了一個(gè)schema參數(shù), 那么不能用SCHEMA子句覆蓋該模式。通常,如果 給出了一個(gè)SCHEMA子句并且它與擴(kuò)展的 schema參數(shù)沖突,則會(huì)發(fā)生錯(cuò)誤。不過(guò),如果也給 出了CASCADE子句,則schema沖突時(shí)會(huì)忽略 schema_name 。 給定的schema_name 將被用來(lái)安裝任何需要的并且沒(méi)有在其控制文件中指定 schema的擴(kuò)展。

記住擴(kuò)展本身被認(rèn)為不在任何模式中:擴(kuò)展具有無(wú)限定的名稱(chēng),并且 要在整個(gè)數(shù)據(jù)庫(kù)范圍內(nèi)唯一。但是屬于擴(kuò)展的對(duì)象可以在模式中。

version

要安裝的擴(kuò)展的版本。這可以寫(xiě)成一個(gè)標(biāo)識(shí)符或者一個(gè)字符串。 默認(rèn)版本在該擴(kuò)展的控制文件中指定。

CASCADE

自動(dòng)安裝這個(gè)擴(kuò)展所依賴(lài)的任何還未安裝的擴(kuò)展。它們的依賴(lài)也會(huì)同樣 被自動(dòng)安裝。如果給出SCHEMA子句,它會(huì)應(yīng)用于這種方式 下安裝的所有擴(kuò)展。這個(gè)語(yǔ)句的其他選項(xiàng)不會(huì)被應(yīng)用于自動(dòng)安裝的擴(kuò)展。 特別地,這些自動(dòng)安裝的擴(kuò)展的默認(rèn)版本將被選中。

注解

在使用CREATE EXTENSION載入擴(kuò)展到數(shù)據(jù)庫(kù)中之前, 必須先安裝好該擴(kuò)展的支持文件。關(guān)于安裝 PostgreSQL提供的擴(kuò)展的信息可以在 額外提供的模塊中找到。

當(dāng)前可以用于載入的擴(kuò)展可以在系統(tǒng)視圖 pg_available_extensions 或者 pg_available_extension_versions 中看到。

小心

以超級(jí)用戶(hù)身份安裝擴(kuò)展程序需要相信擴(kuò)展程序的作者以安全的方式編寫(xiě)了擴(kuò)展程序安裝腳本。 對(duì)于惡意用戶(hù)而言,創(chuàng)建特洛伊木馬對(duì)象并不困難,而這些特洛伊木馬對(duì)象會(huì)損害以后粗心編寫(xiě) 的擴(kuò)展腳本的執(zhí)行,從而使該用戶(hù)獲得超級(jí)用戶(hù)特權(quán)。但是,僅當(dāng)木馬對(duì)象在腳本執(zhí)行期間位于 search_path中時(shí),它們才是危險(xiǎn)的,這意味著它們位于擴(kuò)展的安裝 目標(biāo)模式或它依賴(lài)的某些擴(kuò)展的模式中。因此,在處理未經(jīng)仔細(xì)審查其腳本的擴(kuò)展時(shí),一個(gè)好的 經(jīng)驗(yàn)法則是僅將其安裝到尚未具有CREATE特權(quán)且不會(huì)授予任何不可信用戶(hù)的模式中。 對(duì)它們依賴(lài)的任何擴(kuò)展也是一樣。

針對(duì)此類(lèi)安裝時(shí)攻擊,PostgreSQL提供的插件可以認(rèn)為是 針對(duì)這種安裝時(shí)攻擊的安全,除了少數(shù)插件依賴(lài)于其它的擴(kuò)展。如這些擴(kuò)展的文檔中所述,應(yīng)將 它們安裝到安全模式中,或與它們所依賴(lài)的擴(kuò)展安裝在相同的模式中,或拓展和其依賴(lài)都安裝到 安全模式。

更多有關(guān)編寫(xiě)新擴(kuò)展的內(nèi)容請(qǐng)見(jiàn)第 37.17 節(jié)。

示例

安裝hstore擴(kuò)展到當(dāng)前數(shù)據(jù)庫(kù)中,將其對(duì)象放置在 addons模式中:

CREATE EXTENSION hstore SCHEMA addons;

另一種方法:

SET search_path = addons;
CREATE EXTENSION hstore;

兼容性

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


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)