Saya juga ingin agar hibah ini tetap ada untuk pembuatan tabel baru di masa mendatang.[...] Saya telah menelusuri dokumentasi dan sepertinya saya tidak dapat menemukan solusi yang sesuai.
Karena sebelum 9.0 tidak ada. Yang bisa Anda dapatkan hanyalah mengatur izin untuk yang ada tabel. Anda harus melakukan satu GRANT
untuk setiap tabel, karena sebelum 9.0 tidak ada mode "massal". Lihat tata bahasa SQL untuk 8.4 dan 9.0:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tablename [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
dan 9.0 di sini:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
ALL TABLES IN SCHEMA
yang baru bagian yang Anda lewatkan.
Juga:Mengatur izin pada tingkat basis data seperti pada pertanyaan Anda tidak akan membantu Anda:Anda akan "hanya" mengatur izin pada basis data, tetapi tidak pada hal-hal "berisi" seperti tabel. Bagian yang relevan:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Yang berarti Anda hanya dapat mengatur CREATE
, CONNECT
dan TEMP
izin pada database itu sendiri tetapi tidak ada SELECT
, INSERT
dll.
Sejauh ini untuk hal-hal buruk. Apa yang dapat Anda lakukan adalah sebagai berikut:
-
Kurangi jumlah manajemen izin dengan memberikan hak bukan kepada pengguna tetapi untuk peran. Kemudian tambahkan peran ke pengguna individu. Saat tabel baru dibuat, Anda hanya perlu menyesuaikan satu atau dua peran, bukan ratusan pengguna.
-
Minta katalog sistem dan buat
GRANT
yang sesuai perintah. Simpan ke dalam file dan jalankan file itu. Ini akan memberi Anda permulaan yang lebih mudah.
Kueri semacam itu mungkin terlihat seperti ini:
select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;'
from information_schema.tables
where
table_type = 'BASE TABLE' and
table_schema not in ('pg_catalog', 'information_schema');