2015-06-12 23 views
5

mam zainstalowane rozszerzenia PostgreSQL (unaccent) zJak zrobić przedłużenie Postgres dostępne non administratora

sudo su posgres 
psql create extension unaccent 

i teraz mogę używać unacccent w SQL, ale tylko wtedy, gdy Jestem użytkownik Postgres.

Jak zrobić przedłużenie Postgres dostępne dla wszystkich/inny użytkownik

(Im na Ubuntu z wykorzystaniem PostgreSQL 9.3.5 zainstalowany przy użyciu apt-install)

jthinksearch=# \dx; 
         List of installed extensions 
    Name | Version | Schema |     Description 
----------+---------+------------+--------------------------------------------- 
plpgsql | 1.0  | pg_catalog | PL/pgSQL procedural language 
unaccent | 1.0  | public  | text search dictionary that removes accents 
(2 rows) 

jthinksearch=# 


jthinksearch=> \du; 
          List of roles 
Role name |     Attributes     | Member of 
-----------+------------------------------------------------+----------- 
postgres | Superuser, Create role, Create DB, Replication | {} 
ubuntu |            | {} 

postgres @ ip-172-31- 39-147:/home/ubuntu/code/jthinksearch/reports/src/main/sql $ exit ubuntu @ ip-172-31-39-147: ~/code/jthinksearch/reports/src/main/sql $ psql jthinksearch psql (9.3.5) Wpisz "help", aby uzyskać pomoc.

dałem użytkownika rolę administratora, lecz że pomoc nie zrobił, a następnie jako sugerowane umieścić nazwę schematu w, który miał wpływ na komunikat o błędzie, ale nadal nie działał

jthinksearch=# \du; 
          List of roles 
Role name |     Attributes     | Member of 
-----------+------------------------------------------------+----------- 
postgres | Superuser, Create role, Create DB, Replication | {} 
ubuntu | Superuser          | {} 

jthinksearch=# select unaccent(name) from musicbrainz.artist where id=195660; 
ERROR: function unaccent(character varying) does not exist 
LINE 1: select unaccent(name) from musicbrainz.artist where id=19566... 
      ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. 
jthinksearch=# ^C 
jthinksearch=# select public.unaccent(name) from musicbrainz.artist where id=195660; 
ERROR: text search dictionary "unaccent" does not exist 
jthinksearch=# 
+1

'grant' dostęp do funkcji z rozszerzenia. Jeśli utworzysz rozszerzenie w swoim własnym schemacie, możesz po prostu przyznać dostęp do wszystkiego w tym schemacie. –

+0

Jak, proszę, próbowałem "PRZYZNAJ WSZYSTKIE FUNKCJE W SCHEMA publiczne DO ubuntu" i nie miało to żadnego skutku –

+0

@a_horse_with_no_name Próbowałem wszystkie moje schematy i nadal nie działa –

Odpowiedz

5

Na podstawie tego komunikatu o błędzie:

ERROR: text search dictionary "unaccent" does not exist

i poprzedni gdzie unaccent bez prefiksu schematu nie zostanie znaleziony, oznacza to, że schemat public, gdzie znajduje się funkcja unaccent, nie jest w search_path.

Zdarza się, że unaccent nie powiedzie się w tym przypadku, ponieważ jest to funkcja słownikowa i zasadniczo musi znaleźć swoje rzeczy poprzez search_path.

Zostało to wyjaśnione dokładniej w Does PostgreSQL support “accent insensitive” collations?

Gdy schemat public jest dodawany do search_path tych użytkowników, którzy potrzebują go nazwać (to jest zwykle domyślnie), to powinno działać i nie potrzebują być superużytkownikiem.

Lub jeśli to rozwiązanie nie jest akceptowalne, można również użyć pośredniej funkcji kodu pośredniczącego, która osadza schemat i dodaje niezmienność, jak zasugerowano w odpowiedzi powiązanej powyżej.

+0

ah, thankyou. Tak, to był problem, moja baza danych zawiera dwa schematy, których musiałem użyć, więc wcześniej zrobiłem ALTER USER ubuntu SET search_path = discogs, musicbrainz; zmiana na ALTER USER ubuntu SET search_path = discogs, musicbrainz, public; Naprawiono problem –

+0

Mam dokładnie ten sam problem, nie mogę używać rozszerzenia 'unaccent' bez użytkownika' non postgres'. Ale nadal nie może sprawić, żeby to działało. –