it-swarm.asia

GALAT: tidak ada skema yang dipilih untuk dibuat

Saya bekerja pada database Amazon RDS postgresql di mana saya tahu ada beberapa masalah dengan skema publik (mungkin itu dibatalkan). 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?

Dipecahkan. 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 bisa memeriksa apakah izin di template1 sudah benar (katakanlah, nilai default)?

39

Ini terjadi ketika tidak memiliki USAGE hak istimewa di salah satu skema search_path. Secara default pseudo-role public (semua pengguna) memiliki hak istimewa ini pada skema public, 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 REVOKE ini tidak dilakukan dalam basis data itu, itu mungkin terjadi pada basis data templat dengan mana basis data baru dimodelkan (lihat CREATE DATABASE).


Ketika seorang pengguna memiliki hak istimewa USAGE, tetapi tidak memiliki hak CREATE 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 \x untuk keterbacaan):

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

tidak ada nama file 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 
34
Daniel Vérité

Saya punya 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

6
Panoptik