Jag skulle också vilja att det här anslaget ska bestå för att skapa nya tabeller i framtiden.[...] Jag har muddrat igenom dokumentationen och jag verkar inte hitta en lämplig lösning.
För före 9.0 finns det ingen. Allt du kan få är att ställa in behörigheterna för befintlig tabeller. Du måste göra en GRANT
för varje bord, för före 9.0 fanns det inget "bulk"-läge. Se SQL-grammeraren för 8.4 och 9.0:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tablename [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
och 9.0 här:
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 ]
Den nya ALL TABLES IN SCHEMA
del är den du saknar.
Dessutom:Att ställa in behörigheter på databasnivå som i din fråga hjälper dig inte:Du kommer "bara" att ställa in behörigheterna på databasen, men inte på några "innehållna" saker som tabeller. Relevant avsnitt:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Vilket betyder att du bara kan ställa in CREATE
, CONNECT
och TEMP
behörigheter på själva databasen men ingen SELECT
, INSERT
etc.
Så långt för de dåliga grejerna. Vad du kan göra är följande saker:
-
Minska antalet behörighetshantering genom att ge rättigheter inte till användare utan till roller. Lägg sedan till roller till enskilda användare. När en ny tabell skapas behöver du bara justera en eller två roller, men inte hundratals användare.
-
Fråga i systemkatalogerna och skapa lämplig
GRANT
kommandon. Spara dem i en fil och kör den filen. Detta borde ge dig en enklare start.
En sådan fråga kan se ut så här:
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');