2016-09-28 175 views
4

我正在開發一個應用程序,其中我決定使用主鍵和外鍵的UUID。爲此,我使用了在開發環境中正常工作的擴展名「uuid-ossp」。用戶不能使用擴展「uuid-ossp」

現在,我正在安裝測試環境。數據庫設置由客戶製作的腳本實施。該結構是標準:管理員用戶,應用程序用戶,應用程序命名空間等

我可以創建管理員帳戶的擴展:

$ psql mydb -U [admin_user] 

mydb=# CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; 
CREATE EXTENSION 

mydb=# select uuid_generate_v4(); 
     uuid_generate_v4 
-------------------------------------- 
23e45b57-a658-41a5-8661-0cc06568eff8 

但是,當我與數據庫應用程序用戶連接,我不能生成uuid:

$ psql mydb -U [app_user] 

SELECT uuid_generate_v4(); 

mydb=> select uuid_generate_v4(); 
ERROR: function uuid_generate_v4() does not exist 

admin_user和app_user都在同一個數據庫上。該APP_USER可以「看到」的擴展,但不使用它:

bdd3001=> select * from pg_catalog.pg_extension; 
    extname | [...] 
-----------+- 
plpgsql | [...] 
uuid-ossp | [...] 

任何想法?

回答

3

您需要在您的search_path中安裝擴展的架構。

默認情況下,安裝時將擴展安裝到「當前」模式 - 安裝角色的當前search_path設置。

那麼,你最終安裝呢?見pg_extension.extnamespace

SELECT e.extname 
    , n.nspname  AS home_schema_of_extension 
    , extrelocatable AS extension_can_be_relocated 
FROM pg_catalog.pg_extension e 
JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace; 

extname | home_schema_of_extension | extension_can_be_relocated 
----------+--------------------------+--------------------------- 
plpgsql | pg_catalog    | f 
intarray | public     | t 
tablefunc | public     | t 
pg_trgm | public     | t 
... 

您可以ALTER EXTENSION搬遷的擴展:

ALTER EXTENSION uuid-ossp SET SCHEMA public; 

相關有更多的解釋:

+0

在搜索路徑中添加了「public」。有效。感謝:) –

+1

我有這個問題,我不斷檢查我的db_user的搜索路徑,它看起來不錯,我檢查了使用我的admin_user安裝擴展的位置,它說它在公共模式。原來,admin_user的默認數據庫不同於我爲db_user設置的數據庫。我使用了'psql -d db_user_database'並在那裏添加了擴展名......這樣做 – tenCupMaximum

+0

我還從我的用戶路徑中刪除了一些看起來像'$ {user}'(不記得)的東西。不知道什麼問題會導致行... – tenCupMaximum

3

如果運行在以下210

\dx uuid-ossp 

你會看到安裝擴展(和功能uuid_generate_v4)的模式。

確保

  • app_user具有架構在他的search_path(你可以使用例如ALTER USER app_user SET current_schema = ...改變這所有會話)。

  • app_user有權執行該功能(默認情況下通常是允許的)。

  • app_user對擴展架構具有USAGE權限。

+0

你的答案提示我另一個解決方案,也可以工作:'CREATE EXTENSION「uuid-ossp」WITH SCHEMA my_app_user_schema'。 –

+0

@ArnaudDenoyelle:在app_user的模式中安裝可能意味着其他用戶在其「search_path」中沒有該模式。通常*不*你想要什麼。擴展通常會進入「公共」模式或您在通用「search_path」中設置的某個專用模式。 –