PENGGUNAAN GRANT pada semua skema dalam database?

12

Saya ingin GRANT USAGEmenjadi pengguna / peran untuk database yang diberikan. Basis data memiliki banyak skema.

Saya tahu ada ON ALL TABLES IN SCHEMA, tapi saya ingin "semua skema". Saya sudah mencoba GRANT USAGE .. ON DATABASE, tapi itu jelas salah (sebenarnya tidak ada ).

Ini untuk Postgres 9.3 atau 9.4, itu adalah server yang menggunakan AWS RDS.

tedder42
sumber

Jawaban:

17

Anda memiliki setidaknya dua opsi.

Yang pertama menggunakan kueri kecil dan editor teks. Kami harus mengumpulkan skema yang menarik bagi kami:

SELECT nspname
  FROM pg_namespace;

Anda dapat menambahkan WHEREklausa jika Anda ingin membatasi ruang lingkup. Salin output dan ubah, sehingga Anda mendapatkan sejumlah GRANT USAGE ON SCHEMA ... TO your_role;perintah. Kemudian cukup beri makan psql, misalnya:

psql -f multigrant.sql

Varian yang biasa dari ini bisa berupa skrip shell yang mengulangi nama dan panggilan yang terkumpul psql, meneruskan GRANTpernyataan yang dibuat ke -copsi.

Solusi lain pada dasarnya sama dalam satu blok pl / pgsql, membangun kueri dinamis. Intinya sama - kita harus mengumpulkan schemata. Lalu kami mengulangi semuanya, memberikan skema izin dengan skema:

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;

Catatan :

  • tidak seperti untuk tabel, urutan, fungsi dan tipe, seseorang tidak dapat menetapkan hak default untuk schemata (pada 9.4). Anda harus memberikan hak istimewa ini untuk skema yang baru ditambahkan secara manual.
  • di sini saya menggunakan kutipan dolar ketika membangun kueri dinamis. Ini memungkinkan saya untuk menggunakan sintaks 'normal', sebagai lawan dari penggandaan tanda kutip tunggal, misalnya (tidak ada dalam contoh ini). Dengan cara ini kebanyakan editor akan menyoroti pernyataan dengan baik.
  • Saya juga menggunakan format()dengan %Iformat specifier memiliki nama objek benar dikutip jika diperlukan. Pendekatan ini jauh lebih mudah dibaca daripada membangun kueri dengan rangkaian konstanta string dan beberapa quote_ident()panggilan.
  • pg_namespacedapat ditemukan di pg_catalogskema. Lihatlah benda-benda lain di sana - mereka menyimpan setiap aspek skema Anda, tabel dan sebagainya.
dezso
sumber
1
Saya ingin tahu apakah Anda dapat mensimulasikan hak istimewa default untuk skema yang baru dibuat dengan menggunakan pemicu acara yang secara otomatis menjalankan grant usageskema baru.
a_horse_with_no_name
@a_horse_with_no_name memikirkannya, saya melihat saat ini tidak ada alasan mengapa itu tidak dapat dilakukan.
dezso
0

Anda bisa menggunakannya juga.

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I to your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
Mateus Padua
sumber