HATA: oluşturmak için hiçbir şema seçilmedi


38

Ben kamuoyu şeması ile bazı sorun olduğunu biliyorum amazon RDS postgresql veritabanı üzerinde çalışıyorum (belki düştü). Fakat görünüşe göre şema var ve yine de sorun çözülmedi. Yeni oluşturulan boş bir veritabanı ile örnek bir oturum:

mydb=> CREATE TABLE distributors (
mydb(>     did     integer,
mydb(>     name    varchar(40) UNIQUE
mydb(> );
ERROR:  no schema has been selected to create in
mydb=> show search_path;
  search_path   
----------------
 "$user",public
(1 row)

mydb=> create schema public;
ERROR:  schema "public" already exists

Herhangi bir ipucu? Ne aramalıyım?

Çözüldü. Daniel Vérité'nin cevabı sayesinde aşağıdakileri çözdüm:

grant usage on schema public to public;
grant create on schema public to public;

Bunlar genel şemadaki varsayılan izinler mi?

Veritabanına erişebilen tek bir kullanıcım var, bu yüzden bunun yine de güvenlik riskleri doğuramayacağını düşünüyorum.

Ben aynı değişiklik yapmak gerektiğini düşünüyorum template1 . Doğru mu? Template1'deki izinlerin doğru olup olmadığını nasıl kontrol edebilirim (örneğin, varsayılan değerler)?


3
Belki de kullanıcınız genel şemada tablo oluşturmak için gerekli haklara sahip değildir.
a_horse_with_no_name

Düzenleme sonrası: evet, template1'e bağlanın ve şema izinlerini kontrol edin (düzenlenmiş cevaba bakın).
Daniel Vérité

Yanıtlar:


34

Bu USAGEşemaların hiçbirinde imtiyaz bulunmadığında olur search_path. Varsayılan olarak, sözde rol public(tüm kullanıcılar) publicşema üzerinde bu ayrıcalığa sahiptir, bu nedenle bu hata yalnızca açıkça şunu iptal ettikten sonra gerçekleşir:

revoke usage on schema public from public;

Bu, insanların tablolardan veri seçmeden bile (farklı ayrıcalıklarla verilir) başka insan şemalarına bakmalarının istenmemesi durumunda gereklidir.

Bu REVOKEo veritabanında yapılmamışsa, yeni veritabanlarının modellendiği şablon veritabanında olmuş olabilir (bkz. CREATE DATABASE).


Bir kullanıcı USAGEayrıcalığa sahipken , ancak CREATEşema üzerinde ayrıcalıktan yoksun olduğunda, nesne oluşturmaya çalışırken farklı bir hata oluşur: şema genel için reddedildi .

Psql içindeki ayrıcalıkları kontrol etmek için kullanın \dn+ public.

Varsayılan olarak ( \xokunabilirlik için genişletilmiş ekranla gösterilir ):

# \ dn + genel
Şemaların listesi
- [KAYIT 1] ----- + -------------------------
İsim | Halk, umumi, kamu
Sahibi | postgres
Erişim ayrıcalıkları | postgres = UC / postgres
                  | = UC / postgres
Açıklama | standart genel şema

Önceden soyadı olmaması, =tüm roller için geçerli anlamına gelir (= genel)

Genel KULLANIM ayrıcalığı olmadan

İsim | Halk, umumi, kamu
Sahibi | postgres
Erişim ayrıcalıkları | postgres = UC / postgres
                  | = C / postgres
Açıklama | standart genel şema

Genel KULLANIM veya CREATE ayrıcalıkları olmadan

İsim | Halk, umumi, kamu
Sahibi | postgres
Erişim ayrıcalıkları | postgres = UC / postgres
Açıklama | standart genel şema

Teşekkürler, bu çözüldü! (Ben soruya bir not yazacağım).
Emanuele Paolini,

3

Özel şemada fonksiyonlar yaratan bir pgdump dosyası vardı ve özel şema ismini genel herkese geçirmek istedim ve tüm oluşumları eski şema ile boş bıraktım (örneğin, myschema.tablename, tablename) Ve hata almaya başladım.

ERROR:  no schema has been selected to create in

Benim durumum için hata dökümü mevcut satır başında olduğunda olur

SELECT pg_catalog.set_config('search_path', '', false);

İkinci argümanı "genel" olarak değiştirdim

SELECT pg_catalog.set_config('search_path', 'public', false);

Ve sorun gitti

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.