Vraag GRANT SELECT naar alle tabellen in postgresql


Is er een one-liner die de SELECT-machtigingen naar een nieuwe gebruiker PostGreSQL?

Iets dat de volgende pseudo-code zou implementeren:

GRANT SELECT ON TABLE * TO my_new_user;

77
2017-08-30 14:11


oorsprong




antwoorden:


Ik dacht dat het handig zou zijn om te vermelden dat postgres vanaf 9.0 de syntaxis heeft om privileges toe te kennen aan alle tabellen (evenals andere objecten) in een schema:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

hier is de link.


131
2018-06-26 14:00



Ik zal snel upgraden, dus dit is echt goed nieuws. Bedankt! - Adam Matan
Heeft dit gevolgen voor alle databases op de server die het openbare schema gebruiken? - kristianp
Als ik een nieuwe tabel maak, heeft deze gebruiker dan toegang tot de nieuw gemaakte tabel? - GuiSim
@GuiSim Nee, u moet de default privileges op een schema, waar je de tabel maakt: postgresql.org/docs/current/static/... - SkyRaT
@kristianp Nee, elke database in het PG-cluster heeft zijn eigen openbare schema. Het beïnvloedt alle tabellen (functies) in het schema public voor de huidige DB waarmee u bent verbonden. - SkyRaT


Mijn (niet-one-liner) oplossing:

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

Uitgelopen van de bevoorrechte gebruiker, het werkte als een charme.


11
2018-06-01 06:29



Als je pg_stat_user_tables gebruikt in plaats van all_tables, heb je je grep niet nodig ... Geef ook -A -t door aan psql om de geformatteerde uitvoer te verwijderen. - Magnus Hagander
Merk op dat vanaf Postgres 9.0 de aanpak van dit antwoord het op de moeilijke manier doet. In 9.x hebben we nu "IN ALL" gezien dit andere antwoord. - Basil Bourque


Dit kan worden gedaan met een proces in twee stappen.

  1. Voer deze query uit:

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;
    

    vervangingen:

    $foo = gebruikersnaam waarvoor u rechten wilt verlenen
    $bar, $baz = schema's waaraan u toestemmingen wilt verlenen (kan gewoon "openbaar" zijn)

  2. Dat geeft u een lijst met zoekopdrachten die de vereiste rechten genereren. Kopieer de uitvoer, plak deze in een andere query en voer deze uit.


8
2017-08-05 13:25





Dit is wat ik heb gebruikt:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

Ik voel dat het natuurlijker is om opmaak en where-clausules in sql te doen.


2
2017-11-30 00:38





Ik werk met postgres 8.4 en geef alle rechten aan een gebruiker om het volgende te doen:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done

1
2018-04-05 18:04



In het Engels alstublieft. - Linger


een manier om dit te verhelpen is om een ​​opgeslagen procedure te schrijven. helaas is er geen commando "geef alles aan alle tafels" of zo. je hebt echt een procedure of een extern shell-script nodig om dit te laten werken.


0
2017-07-03 18:20





Uiteindelijk heb ik het gedaan deze, en het werkte:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;

0