Memberikan akses ke semua tabel untuk pengguna

151

Saya baru mengenal Postgres dan mencoba untuk memigrasi database MySQL kami. Dalam MySQL saya bisa memberikan SELECT, UPDATE, INSERT, dan DELETEhak istimewa pada pengguna istimewa yang rendah dan memungkinkan hibah yang berlaku untuk semua tabel dalam database tertentu. Saya pasti kehilangan sesuatu di Postgres karena sepertinya saya harus memberikan hak istimewa itu untuk setiap tabel satu per satu. Dengan banyak basis data dan ratusan tabel per basis data yang tampak seperti tugas yang menakutkan hanya untuk memulai. Selain itu, setelah database beroperasi, menambahkan tabel cukup sering terjadi sehingga saya tidak ingin harus memberikan izin setiap kali kecuali benar-benar diperlukan.

Bagaimana ini bisa dilakukan?

PlaidFan
sumber

Jawaban:

175

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 REVOKEperlu 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_roleadalah peran yang menciptakan tabel, sementara user_nameadalah orang yang mendapatkan hak istimewa. Mendefinisikan ini, Anda harus masuk sebagai some_roleatau menjadi anggota.

Dan, akhirnya, Anda harus melakukan hal yang sama untuk urutan (terima kasih kepada PlaidFan untuk menunjukkannya) - ini dia USAGEhak istimewa yang Anda butuhkan.

dezso
sumber
1
Terima kasih, FOR some_roleadalah bagian penting yang saya lewatkan untuk membuatnya berfungsi untuk tabel saya yang dibuat nanti. Tapi saya tidak harus masuk karena some_role, itu berfungsi juga jika saya menjalankan kueri sebagai postgrespengguna admin default .
JustAMartin
54

dengan asumsi Anda ingin memberi mereka semua hak istimewa - lakukan ini:

grant all privileges on database dbname to dbuser;

di mana dbnamenama database Anda dan dbusernama pengguna.

alxkls
sumber
44
Ini akan menambahkan hak berikut pada basis data : CREATE, CONNECT, TEMPORARY. Tidak ada hak istimewa di atas meja.
dezso
13
Perintah serupa untuk semua tabel adalah,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci
5
Saya menemukan ini berguna juga:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo
18

Memberikan semua hak istimewa ke semua tabel dalam basis data dicapai dengan

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;
Nomadme
sumber
15

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:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;
Akan
sumber
2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
Jorge Valenzuela
sumber