sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL 8.4 verleent DML-rechten op alle tabellen aan een rol

Ik zou ook graag willen dat deze subsidie ​​ook in de toekomst blijft bestaan ​​voor het maken van nieuwe tabellen.[...] Ik heb de documentatie doorzocht en ik kan geen geschikte oplossing vinden.

Omdat er vóór 9.0 geen is. Het enige dat u kunt krijgen, is de machtigingen instellen voor bestaande tafels. Je moet één GRANT . doen voor elke tafel, omdat er vóór 9.0 geen "bulk" -modus was. Zie de SQL-grammer voor 8.4 en 9.0:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

en 9.0 hier:

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 ]

De nieuwe ALL TABLES IN SCHEMA een deel is degene die je mist.

Ook:machtigingen instellen op databaseniveau zoals in uw vraag zal u niet helpen:u zult "alleen" de machtigingen op de database instellen, maar niet op "bevatte" dingen zoals tabellen. De relevante sectie:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Wat betekent dat je alleen CREATE . kunt instellen , CONNECT en TEMP machtigingen op de database zelf, maar geen SELECT , INSERT enz.

Tot zover de slechte dingen. Wat u kunt doen zijn de volgende dingen:

  • Verminder het aantal machtigingenbeheer door rechten niet aan gebruikers maar aan rollen te verlenen. Voeg vervolgens rollen toe aan individuele gebruikers. Wanneer een nieuwe tabel wordt gemaakt, hoeft u slechts een of twee rollen aan te passen, maar niet honderden gebruikers.

  • Doorzoek de systeemcatalogi en creëer de juiste GRANT commando's. Sla ze op in een bestand en voer dat bestand uit. Dit zou u een gemakkelijkere opstart moeten geven.

Zo'n zoekopdracht kan er als volgt uitzien:

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');


  1. Eenvoudige PHP SQL-aanmeldingsproblemen oplossen

  2. Long converteren naar Varchar2

  3. SSIS - de waarde kan niet worden geconverteerd vanwege mogelijk gegevensverlies

  4. Waarom u PHP's PDO zou moeten gebruiken voor databasetoegang