2013-12-21 32 views
31

當我試圖讓我的數據庫hstore:爲什麼只有超級用戶CREATE EXTENSION hstore,而不是Heroku?

=> CREATE EXTENSION IF NOT EXISTS hstore; 
ERROR: permission denied to create extension "hstore" 
HINT: Must be superuser to create this extension. 

我的用戶是不是超級用戶,但數據庫的所有者。

根據the CREATE EXTENSION docs

加載的擴展需要,將需要創建的組件對象相同的權限。對於大多數擴展,這意味着需要超級用戶或數據庫所有者權限。誰運行創建擴展的用戶成爲擴展後的權限檢查目​​的的擁有者,以及通過擴展的腳本創建的任何對象的所有者。

什麼hstore這樣做需要超級用戶權限?它是否影響到我將其添加到數據庫之外的部分集羣?


而且confundity:

The DB user Heroku Postgres provides is not a superuser

的Heroku Postgres的用戶將被授予對他們的數據庫中所有非超級用戶的權限。這些措施包括SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGE

然而,that user is able to CREATE EXTENSION hstore

要創建任何支持擴展,打開與Heroku的第一個會話:PSQL並運行相應的命令:

$ heroku pg:psql 
Pager usage is off. 
psql (9.2.4) 
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256) 
Type "help" for help. 

ad27m1eao6kqb1=> CREATE EXTENSION hstore; 
CREATE EXTENSION 
ad27m1eao6kqb1=> 

(對於情況下,我「M試圖建立一個Dokku部署,所以相比於Heroku的是特別重要的。)

+0

我想這是因爲它需要加載/綁定,只有超級用戶被允許做本地庫(DLL /左右)。 –

+0

我和你在一起@a_horse_with_no_name,它需要修改服務器的過程,所以認爲這就是爲什麼它需要SU,我通常使用SU,切換到數據庫所有者之前加載它作爲引導的一部分,但無法找到的文檔支持 – Doon

+0

嗯。這很有道理,但看到我對Heroku的補充。在設置使非超級用戶成爲「CREATE EXTENSION hstore」的DB時,Heroku有沒有提前做過? – Peeja

回答

34

hstore擴展創建可從外部動態對象調用代碼的函數,該對象需要超級用戶權限。這就是爲什麼創建hstore擴展需要超級用戶權限。

至於Heroku的,這是我的理解是,他們採用了特殊的擴展白名單模塊,它允許用戶創建特定擴展名的,即使他們不是超級用戶運行。我相信它是基於這個代碼:https://github.com/dimitri/pgextwlist。如果您想在數據庫中使用相同的功能,您可以嘗試自行安裝該代碼。

+0

你能告訴哪個外部對象擴展使用?正如我想這個對象是在數據庫基礎設施。 –

相關問題