Izin ditolak untuk hubungan <tabel>

12

Saya telah menjalankan SQL berikut di psql:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

Ketika saya masuk sebagai bspu, dan mencoba untuk menanyakan userstabel, saya mendapatkan kesalahan:

permission denied for relation users

Saya mencoba berlari:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

Tapi itu tidak membantu. Apa yang saya lakukan salah? Mengapa pemilik basis data TIDAK memiliki izin untuk melakukan kueri terhadap database sendiri?

EDIT: Saya ditingkatkan bspuke superuser untuk saat ini, sehingga saya dapat terus bekerja. Bimbingan lebih lanjut dihargai.

jika __name__ Tidak Ada
sumber
Apa output dari \dt "users"pertunjukan?
bma
@ bma hanya acc utama saya yang terdaftar.
jika __name__ adalah None
Anda menjalankan perintah awal sebagai pengguna apa? Apa yang Anda dapatkan dari SELECT session_user, current_userbagian atas skrip Anda? Dan apa versi Postgres Anda?
Erwin Brandstetter
Jika ini adalah perintah persis yang Anda jalankan, maka Anda masih terhubung dengan 'acc utama' Anda. Jadi turun hak istimewa apa yang Anda miliki. Kalau tidak, lihat jawaban sempurna Erwin. (Izinkan saya mengakui bahwa saya merasa bodoh bahwa pesan kesalahan ini tidak memberi tahu peran mana yang tidak memiliki izin. Misalnya, ketika seseorang menjalankan rangkaian fungsi dengan SECURITY DEFINER, cukup cepat membingungkan siapa adalah siapa.)
dezso

Jawaban:

22

DEFAULT PRIVILEGESjangan tidak mengubah izin untuk ada objek. Mereka adalah hak default untuk objek yang baru dibuat dan hanya untuk peran tertentu yang mereka miliki. Jika Anda tidak mendefinisikan peran saat berjalan ALTER DEFAULT PRIVILEGES, itu default ke peran saat ini (saat menjalankan ALTER DEFAULT PRIVILEGESpernyataan.

Juga, karena Anda menggunakan serialkolom, yang menciptakan SEQUENCE, Anda juga ingin mengatur hak default untuk urutan.

Jalankan ini pada pengguna yang Anda buat objek dengan, sebelum Anda menjalankan CREATEperintah:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

Jika Anda harus menggunakan pgAdmin, kata hati-hati. Ada bug dalam versi saat ini 1,20 (atau lebih tua) pada tampilan skrip SQL engineered terbalik DEFAULT PRIVILEGES. Layar mengabaikan pengguna yang memiliki dan oleh karena itu salah dalam situasi tertentu. Saya melaporkan bug, masalah ini tertunda .

Untuk objek yang sudah ada, Anda mungkin tertarik dengan bentuk GRANTperintah "batch" ini :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

Lebih lanjut di bawah pertanyaan terkait ini di SO:

Erwin Brandstetter
sumber
1
Bug yang disebutkan masih ada di pgAdmin4, lihat redmine.postgresql.org/issues/4685 , yang telah ditandai sebagai duplikat redmine.postgresql.org/issues/4256
dpprdan
-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
Srinu Mareti
sumber