2011-09-13 26 views
9

RedHat üzerinde PostgreSQL 9.0.3 kullanıyorum. Veritabanı, iki şema, public ve wh içerir. django adlı yeni bir rol oluşturdum. Bu kullanıcının wh şemasını varsayılan olarak kullanmasını istiyorum.PostgreSQL search_path değiştirilmedi olarak bildirimde bulunmuyor

kılavuzda ardından yaptım:

ALTER USER django SET SEARCH_PATH TO wh, public; 

Bu işe görünmektedir: Sonra yaparsanız

SHOW SEARCH_PATH; 
search_path 
------------- 
wh, public 

Ancak, \dt, kamu şema sadece tablolar

görüntülenir. Kılavuzda, arama yolunu değiştirmenin hemen bir etkisi olmalı ve bir önek olmadan wh tablolarına erişebilmem gerekir, ancak durum böyle değil. Oturum açma ve kapatma, değişiklikleri search_path olarak korur, ancak herhangi bir davranış değişikliği göstermez.

Neyi eksik?

cevap

11

Bu sorununuzu çözebilir (Ya da istediğinizi istiyorsanız GRANT ALL ...)

search_path ayarı, Postgres'i loo'ya yönlendirir Listelenen şemalardaki nesneler için k. Orada ne olduğunu görmek için izin vermez. "Django" gerekli ayrıcalıklara sahip değilse, \dt bu bilgiyi göstermemeli (ve göstermez).

Diğer taraftan, süper kullanıcı olarak denediyseniz (önceki öneriyle ilgili yorumunuza göre), o zaman bu olmayabilir ...PostgreSQL için

+0

Merhaba Erwin, Bu işe yaradı! Bu role süper kullanıcı vermenin bunu başaramadığı çok garip. Bununla birlikte, şemadaki açık hibe, davranışı doğru hale getirir. Katkıda bulunan herkese çok teşekkür ederim. – talonsensei

+1

"SELECT id from mytable" gibi bir şema niteliği olmayan bir tabloyu sorgularken, PG "mytable" ilişkisinin var olmadığını söyler, çünkü var olduğunu bildiğinizden biraz yanıltıcıdır, ancak belki de erişim. Bu nedenle, tabloyu "SELECT id FROM myschema.mytable" gibi uygun bir şema adıyla sorguladığınızda, bunun yerine şu iletiyi alırsınız: "şema için izin reddedildi." 'ifadesi gerekli. Bu, sorgularda tam nitelikli şema adlarının kullanılmasının iyi bir fikir olmasının bir nedenidir. –

+0

Hey Erwin, Çözüm için teşekkürler, beni kurtardın! :-) ve soruyu başlatmak için talonsensei sayesinde :-) – shahjapan

0

Bu, \dt komutunun bir sınırlaması olabilir.

Search_path'in düzgün çalıştığını doğrulamak için'u çalıştırmayı deneyin; burada some_table, wh şemasında bulunan bir tanesidir.

+0

Öneriniz için teşekkürler. Bunu denedim, ancak tablonun mevcut olmadığını söyleyen bir hata alıyorum. Sorguyu wh ile önlersem çalışır. Yani bir \ dt sınırlaması – talonsensei

0

Sadece Windows 64-bit üzerinde 9.1 üzerinde (sadece sürüm) test ettim ve belirtildiği gibi çalıştı. ALTER ROLE manpage gelen

alıntı:

kalan varyantları, bir yapılandırma değişkeni için Bir rolün oturumu varsayılan değiştirmek ya sadece oturumları için İÇİNDE VERİTABANI deyimi belirtilmemişse tüm veritabanları veya, için adlandırılmış veritabanı. Bu rol, daha sonra yeni bir oturum başlattığında, belirtilen değeri, oturum varsayılanı olur; bu, postgresql.conf dosyasında öğesinin mevcut olup olmadığı veya postgres komut satırından alındığında geçersiz kılınır. Bu yalnızca, oturum açma zamanında gerçekleşir; SET ROLE veya SET SESSION AUTHORIZATION öğesinin ayarlanması, ayarlanacak yeni yapılandırma değerlerine neden olmaz.

GRANT USAGE ON SCHEMA wh TO django; 

(. Ya da (doğrudan veya dolaylı) üye olarak django olan herhangi rolüne HİBE KULLANIM)
:

(vurgu mayın)

+0

gibi görünmüyor. Teşekkür ederim Milen. Bunu yaptım. Birincil yönetici/süper kullanıcı rolü ile bu çalışır ve bir \ dt sadece şemadaki tabloları gösterir. Ancak, bir nedenden ötürü anlayamıyorum, bunu başka bir kullanıcı için yaptığım zaman, ben de yönetici/süper kullanıcı yapsam bile, bir \ dt, yol değiştirilmiş olsa bile, sadece genel tabloları gösterir. – talonsensei

+0

Bunu güvenilir bir şekilde yeniden üretebilir ve küçük bir test durumu tasarlayabilirseniz, geliştiricilerin sizden haber almak isteyeceklerine inanıyorum. Ancak önce bunu kullandığınız ana sürümün (9.0) en son küçük sürümünde (9.0.4) test ettiğinizden/yeniden ürettiğinizden emin olmalısınız. –

+0

Teşekkürler Milen. İnanıyorum ki tekrarlanabilir. Hem 9.0.1 (Snow Leopard) hem de 9.0.3 (Redhat) yüklemelerinde test ettim. – talonsensei

0

, bir kullanıcı bir veritabanını bağlamak ve öncelikle bir tablo gibi nesneleri bakarsanız o olacak sadece kullanıcı adının aynı adı olarak şeması için görünüyor, bulunmazsa eğer, bu olacak kamu şeması için bakış, Durumunuzda, veritabanını django kullanıcısıyla bağlarsanız, varsayılan olarak şema django'yu arar, ancak şu anki şemaya sahip olmak istersiniz, bu nedenle şema adını ve rol adını aynı yapın ve veritabanına giriş yapın rol, önek yazmadan, sorununuzu çözecek, sadece bir deneyin!

+0

Merhaba Francs, Öneriniz mükemmel bir anlam ifade ediyor ve denedim, ancak kullanıcı için varsayılan arama alanı hala "$ user", public ve \ dt hala sadece genel tabloları gösterir. Current_schemas (true) çıktısı {pg_catalog, public}. Yani işe yaramıyor. – talonsensei

+0

şimdi, kullanıcı adınız ve şema adınız nedir? veritabanı bir prod db değilse, aynı adı da yapabilirsiniz. Ayrıca tablonun sahibinin ismine de dikkat edin. – francs