GALAT: tidak ada skema yang dipilih untuk dibuat

38

Saya bekerja pada database postgresql amazon RDS di mana saya tahu ada beberapa masalah dengan skema publik (mungkin itu dijatuhkan). Tapi ternyata skema itu ada, dan lagi pula masalahnya tidak terpecahkan. Berikut adalah contoh sesi dengan database kosong yang baru dibuat:

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

Ada petunjuk? Apa yang harus saya cari?

Terpecahkan. Terima kasih atas jawaban Daniel Vérité yang telah saya pecahkan dengan yang berikut:

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

Apakah ini izin default pada skema publik?

Saya memiliki satu pengguna yang dapat mengakses database, jadi saya pikir ini toh tidak dapat meningkatkan risiko keamanan ...

Saya pikir saya harus membuat modifikasi yang sama pada template1 . Apakah itu benar? Bagaimana saya dapat memeriksa apakah izin di template1 sudah benar (katakanlah, nilai default)?

Emanuele Paolini
sumber
3
Mungkin pengguna Anda tidak memiliki hak yang diperlukan untuk membuat tabel di skema publik.
a_horse_with_no_name
Edit berikut: ya, sambungkan ke templat1 dan periksa izin skema (lihat jawaban yang diedit).
Daniel Vérité

Jawaban:

34

Ini terjadi ketika tidak memiliki USAGEhak istimewa di salah satu skema search_path. Secara default pseudo-role public(semua pengguna) memiliki hak istimewa ini pada publicskema, jadi kesalahan ini terjadi hanya setelah mencabutnya secara eksplisit dengan:

revoke usage on schema public from public;

Ini diperlukan ketika tidak diinginkan bahwa orang mengintip skema orang lain, bahkan tanpa memilih data dari tabel (yang diberikan melalui hak istimewa yang berbeda).

Jika ini REVOKEbelum dilakukan dalam database itu, itu mungkin telah terjadi dalam database templat dengan mana database baru dimodelkan (lihat CREATE DATABASE).


Ketika pengguna memiliki USAGEhak istimewa, tetapi tidak memiliki CREATEhak istimewa pada skema, itu adalah kesalahan yang berbeda ketika mencoba membuat objek: izin ditolak untuk skema publik .

Untuk memeriksa hak istimewa di dalam psql, gunakan \dn+ public.

Secara default (ditampilkan dengan tampilan yang diperluas \xagar mudah dibaca):

# \ dn + publik
Daftar skema
- [REKAM 1] ----- + -----------------------
Nama | publik
Pemilik | postgres
Hak akses | postgres = UC / postgres
                  | = UC / postgres
Deskripsi | skema publik standar

kurangnya nama rol sebelum =berarti itu untuk semua peran (= publik)

Tanpa hak istimewa USAGE publik

Nama | publik
Pemilik | postgres
Hak akses | postgres = UC / postgres
                  | = C / postgres
Deskripsi | skema publik standar

Tanpa PENGGUNAAN publik atau MENCIPTAKAN hak istimewa

Nama | publik
Pemilik | postgres
Hak akses | postgres = UC / postgres
Deskripsi | skema publik standar
Daniel Vérité
sumber
Terima kasih, ini terpecahkan! (Saya akan menulis catatan dalam pertanyaan).
Emanuele Paolini
3

Saya memiliki file pgdump dengan membuat fungsi dalam skema khusus dan saya ingin mengganti nama skema khusus ke publik dan mengganti semua kejadian dengan skema lama menjadi kosong (mis. Myschema.tablename ke tablename) Dan mulai menerima kesalahan

ERROR:  no schema has been selected to create in

Untuk kasus saya kesalahan terjadi ketika pada awal dump baris ini

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

Saya telah mengubah arg kedua menjadi "publik"

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

Dan masalah hilang

Panoptik
sumber