Jeg vil også gerne have, at denne bevilling fortsætter til oprettelse af nye bord også i fremtiden.[...] Jeg har mudret gennem dokumentationen, og jeg kan tilsyneladende ikke finde en passende løsning.
For før 9.0 er der ingen. Det eneste du kan få er at indstille tilladelserne for eksisterende tabeller. Du skal gøre én GRANT
for hvert bord, for før 9.0 var der ingen "bulk"-tilstand. Se SQL-grammeren for 8.4 og 9.0:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[,...] | ALL [ PRIVILEGES ] }
ON [ TABLE ] tablename [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
og 9.0 her:
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 nye ALL TABLES IN SCHEMA
del er den, du mangler.
Også:At indstille tilladelser på databaseniveau som i dit spørgsmål hjælper dig ikke:Du vil "kun" indstille tilladelserne på databasen, men ikke på nogen "indeholdt" ting som tabeller. Det relevante afsnit:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE dbname [, ...]
TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Hvilket betyder, at du kun kan indstille CREATE
, CONNECT
og TEMP
tilladelser på selve databasen, men ingen SELECT
, INSERT
osv.
Så langt for de dårlige ting. Hvad du kan gøre er følgende ting:
-
Reducer antallet af tilladelsesadministrationer ved at give rettigheder ikke til brugere, men til roller. Tilføj derefter roller til individuelle brugere. Når en ny tabel oprettes, behøver du kun at justere en eller to roller, men ikke hundredvis af brugere.
-
Forespørg i systemkatalogerne og opret passende
GRANT
kommandoer. Gem dem i en fil, og kør den fil. Dette burde give dig en lettere opstart.
Sådan en forespørgsel kan se sådan ud:
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');