Berikan semua izin kepada pengguna pada DB

206

Saya ingin memberi pengguna semua izin pada database tanpa menjadikannya admin. Alasan mengapa saya ingin melakukan itu adalah bahwa saat ini DEV dan PROD adalah DB yang berbeda pada kluster yang sama sehingga saya tidak ingin pengguna dapat mengubah objek produksi tetapi harus dapat mengubah objek pada DEV.

Saya mencoba:

grant ALL on database MY_DB to group MY_GROUP;

tapi sepertinya tidak memberi izin.

Kemudian saya mencoba:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

dan tampaknya memberi saya izin untuk membuat objek tetapi tidak meminta \ menghapus objek pada skema yang milik pengguna lain

Saya dapat melanjutkan dengan memberikan izin USAGE kepada pengguna di MY_SCHEMA tetapi kemudian akan mengeluh tentang tidak memiliki izin di atas meja ...

Jadi saya kira pertanyaan saya adalah: apakah ada cara mudah memberikan semua izin kepada pengguna pada DB?

Saya sedang mengerjakan PostgreSQL 8.1.23.

Diego
sumber

Jawaban:

271

Pengguna membutuhkan akses ke database , jelas:

GRANT CONNECT ON DATABASE my_db TO my_user;

Dan (setidaknya) USAGEhak istimewa pada skema :

GRANT USAGE ON SCHEMA public TO my_user;

Atau berikan USAGEpada semua skema khusus:

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
   SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

Kemudian, semua izin untuk semua tabel (membutuhkan Postgres 9.0 atau lebih baru).
Dan jangan lupa urutan (jika ada):

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

Untuk versi yang lebih lama, Anda dapat menggunakan "Grant Wizard" dari pgAdmin III (GUI default).

Ada beberapa objek lain, manual untukGRANT memiliki daftar lengkap pada Postgres 12:

hak istimewa pada objek basis data (tabel, kolom, tampilan, tabel asing, urutan, database, pembungkus data asing, server asing, fungsi, prosedur, bahasa prosedural, skema, atau tablespace)

Tetapi sisanya jarang dibutuhkan. Keterangan lebih lanjut:

Pertimbangkan untuk meningkatkan ke versi saat ini .

Erwin Brandstetter
sumber
133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
Unkas
sumber
24
Memberi semua hak istimewa ON DATABASEterdengar perkasa, tapi itu tidak banyak membantu. Itu baru permulaan. Itu tidak memberikan hak istimewa pada benda yang terkandung.
Erwin Brandstetter
50

Di PostgreSQL 9.0+ Anda akan melakukan hal berikut:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

Jika Anda ingin mengaktifkan ini untuk hubungan yang baru dibuat juga, maka atur izin default:

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

Namun, melihat bahwa Anda menggunakan 8.1 Anda harus kode sendiri:

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

Ini akan mengatur hak istimewa pada semua relasi: tabel, tampilan, indeks, urutan, dll. Jika Anda ingin membatasi itu, filter pada pg_class.relkind. Lihat dokumen pg_class untuk detailnya.

Anda harus menjalankan fungsi ini sebagai superuser dan teratur seperti yang dibutuhkan aplikasi Anda. Pilihannya adalah mengemas ini dalam pekerjaan cron yang dijalankan setiap hari atau setiap jam.

Patrick
sumber
Hai Patrick, "ALL TABLES" tidak tersedia di 8.1 ( postgresql.org/docs/8.1/static/sql-grant.html ) Saya tahu saya bisa mengulang-ulang tabel dan memberikan izin satu per satu, tapi inilah yang saya berusaha menghindar. tapi terima kasih atas bantuan Anda
Diego
@Diego: Solusi tambahan untuk 8.1
Patrick
terima kasih patrick, saya akhirnya menggunakan sesuatu seperti yang Anda lakukan tetapi tidak menggunakan "GRANT ALL". Untuk beberapa alasan sepertinya tidak melakukan apa-apa. Sebagai contoh, saya berlari: berikan ALL pada tes skema untuk userA; tetapi setelah itu userA masih tidak memiliki akses untuk membaca dari tabel pada tes skema
Diego
2
Anda harus MENGGANTI PENGGUNAAN pada suatu skema. Kemudian pada semua hubungan dalam skema itu (tabel, tampilan, urutan, indeks, dll) Anda harus GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE secara terpisah. Skema adalah ruang nama, relasi adalah tempat data Anda berada.
Patrick
28

Saya melakukan yang berikut ini untuk menambahkan peran 'eSumit' pada database PostgreSQL 9.4.15 dan memberikan semua izin untuk peran ini:

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

Juga memeriksa entri pg_table melalui:

pilih * dari pg_roles; masukkan deskripsi gambar di sini

Bidikan snapshot basis data: masukkan deskripsi gambar di sini

Sumit Arora
sumber
Saya memiliki Postgres versi 10.3 dan melempar kesalahan sintaksis ketika saya menggunakan tanda kutip di sekitar nama database.
sajid