11

主キーと外部キーに UUID を使用することにしたアプリケーションを開発しています。この目的のために、開発環境で正常に動作する拡張機能「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 | [...]

何か案は?

4

2 に答える 2

12

に拡張機能をインストールしたスキーマが必要です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;

より多くの説明に関連:

于 2016-09-28T15:20:09.027 に答える
4

で以下を実行するとpsql

\dx uuid-ossp

uuid_generate_v4拡張機能 (および関数) がインストールされているスキーマが表示されます。

確認してください

  • app_userにはスキーマがあります(たとえば、将来のすべてのセッションでこれを変更するためにsearch_path使用できます)。ALTER USER app_user SET current_schema = ...

  • app_user関数を実行する権限があります (これは通常、デフォルトで許可されています)。

  • app_userUSAGE拡張スキーマに対する権限を持っています。

于 2016-09-28T15:31:10.767 に答える