Pertama, Anda harus dapat terhubung ke database untuk menjalankan kueri. Ini bisa dicapai dengan
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;
GRANT CONNECT
ON DATABASE database_name
TO user_name;
Itu REVOKE
perlu karena
Kata kunci PUBLIC menunjukkan bahwa hak istimewa harus diberikan kepada semua peran, termasuk yang mungkin dibuat nanti. PUBLIC dapat dianggap sebagai kelompok yang didefinisikan secara implisit yang selalu mencakup semua peran. Setiap peran tertentu akan memiliki jumlah hak istimewa yang diberikan secara langsung kepadanya, hak istimewa yang diberikan kepada peran apa pun yang saat ini menjadi anggotanya, dan hak istimewa yang diberikan kepada PUBLIC.
Jika Anda benar-benar ingin membatasi pengguna Anda pada pernyataan DML, maka Anda harus melakukan lebih banyak lagi:
REVOKE ALL
ON ALL TABLES IN SCHEMA public
FROM PUBLIC;
GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public
TO user_name;
Ini mengasumsikan bahwa Anda hanya akan memiliki satu skema (yang dinamai 'publik' secara default).
Seperti yang ditunjukkan Jack Douglas, hal di atas hanya memberikan hak istimewa untuk tabel yang sudah ada . Untuk mencapai hal yang sama untuk tabel di masa mendatang, Anda harus mendefinisikan hak default :
ALTER DEFAULT PRIVILEGES
FOR ROLE some_role -- Alternatively "FOR USER"
IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;
Di sini, some_role
adalah peran yang menciptakan tabel, sementara user_name
adalah orang yang mendapatkan hak istimewa. Mendefinisikan ini, Anda harus masuk sebagai some_role
atau menjadi anggota.
Dan, akhirnya, Anda harus melakukan hal yang sama untuk urutan (terima kasih kepada PlaidFan untuk menunjukkannya) - ini dia USAGE
hak istimewa yang Anda butuhkan.
FOR some_role
adalah bagian penting yang saya lewatkan untuk membuatnya berfungsi untuk tabel saya yang dibuat nanti. Tapi saya tidak harus masuk karenasome_role
, itu berfungsi juga jika saya menjalankan kueri sebagaipostgres
pengguna admin default .dengan asumsi Anda ingin memberi mereka semua hak istimewa - lakukan ini:
di mana
dbname
nama database Anda dandbuser
nama pengguna.sumber
CREATE, CONNECT, TEMPORARY
. Tidak ada hak istimewa di atas meja.GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Memberikan semua hak istimewa ke semua tabel dalam basis data dicapai dengan
sumber
Mungkin saya melakukan sesuatu yang salah di sini karena saya sangat baru di PostgreSQL. Tapi ini hanya memecahkan bagian pertama dari masalah bagi saya - menetapkan hak istimewa pada semua tabel yang ada.
Agar izin ditetapkan dengan benar untuk pengguna saya di tabel baru, yang dibuat saya harus menetapkan izin default untuk pengguna:
sumber
sumber