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)?
sumber
Jawaban:
Ini terjadi ketika tidak memiliki
USAGE
hak istimewa di salah satu skemasearch_path
. Secara default pseudo-rolepublic
(semua pengguna) memiliki hak istimewa ini padapublic
skema, jadi kesalahan ini terjadi hanya setelah mencabutnya secara eksplisit dengan: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
REVOKE
belum dilakukan dalam database itu, itu mungkin telah terjadi dalam database templat dengan mana database baru dimodelkan (lihatCREATE DATABASE
).Ketika pengguna memiliki
USAGE
hak istimewa, tetapi tidak memilikiCREATE
hak 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
\x
agar mudah dibaca):kurangnya nama rol sebelum
=
berarti itu untuk semua peran (= publik)Tanpa hak istimewa USAGE publik
Tanpa PENGGUNAAN publik atau MENCIPTAKAN hak istimewa
sumber
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
Untuk kasus saya kesalahan terjadi ketika pada awal dump baris ini
Saya telah mengubah arg kedua menjadi "publik"
Dan masalah hilang
sumber