Vraag Postgresql: wat doen ALLE PRIVILEGES op DATABASE TOE?


Ik probeer alle rechten op alle tabellen van een gegeven database te verlenen aan een nieuwe gebruiker van postgres (niet de eigenaar). Het lijkt erop dat GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user; doet dat niet. Nadat ik de opdracht met succes heb uitgevoerd (als de gebruiker van postgres), krijg ik het volgende als nieuwe_user:

$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR:  permission denied for relation a_table_in_my_db

Twee vragen:

1) Wat doet de bovenstaande opdracht dan, als niet alle rechten op alle tabellen op my_db worden verleend?

2) Wat is de juiste manier om alle rechten op alle tabellen aan een gebruiker te verlenen? (inclusief op alle tabellen die in de toekomst zijn gemaakt)


54
2017-11-04 02:45


oorsprong




antwoorden:


De antwoorden op uw vragen komen van de online PostgreSQL 8.4 documenten.

  1. GRANT ALL PRIVILEGES ON DATABASE verleent de CREATE, CONNECT, en TEMPORARY privileges op een database voor een rol (gebruikers worden correct genoemd als rollen). Geen van deze privileges staat daadwerkelijk toe dat een rol gegevens uit een tabel leest; SELECT privilege op de tafel is daarvoor vereist.

  2. Ik weet niet zeker of er een "juiste" manier is om alle rechten op alle tafels een rol te geven. De beste manier om een ​​bepaalde rol te garanderen heeft alle privileges op een tafel om ervoor te zorgen dat de rol bezit de tafel. Standaard is elk nieuw object eigendom van de rol die het heeft gemaakt. Als u dus wilt dat een rol alle rechten op een tabel heeft, gebruikt u die rol om het te maken.

    PostgreSQL 9.0 introduceert de volgende syntaxis bijna wat je wilt:

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    Het probleem is dat als u tabellen maakt in schema's buiten het standaard "openbare" schema, dit GRANT zal niet op hen van toepassing zijn. Als u niet-openbare schema's gebruikt, moet u dit doen GRANT de privileges van deze schema's afzonderlijk.


76
2017-11-04 04:28



kan een database meerdere eigenaren hebben? zo ja, hoe voeg je een andere eigenaar toe? - rz.
nee, ik denk niet dat een database meer dan één eigenaar kan hebben, je zou ze echter alle schrijfacties van een eigenaar kunnen geven - hellomynameisjoel
vergeet niet dat je hetzelfde moet maken op sequenties: GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user; of u kunt geen records invoegen.
Probeer het volgende, zelfs als het niet werkt: = TOESTAAN ALLE VOORRECHTEN VOOR ALLE TABELLEN IN SCHEMA openbaar AAN uw_gebruiker; - Kaustubh


Het is mogelijk om meerdere aanmeldingen in te stellen om als database-eigenaar te fungeren:

  • Maak een "nologin" -rol om op te treden als de eigenaar: create role dbowner nologin
  • Wijzig de eigenaar van uw database in dit: alter database mydb owner dbowner
  • Verleen al uw aanmeldingen aan deze nieuwe rol: grant dbowner to user1, user2

Nu, als user1 of user2 inloggen, hebben ze alle permissies op "mydb" zonder verdere vereiste subsidies.

Ik zou deze oplossing echter zorgvuldig overwegen. Het is verleidelijk om uw webtoepassing een van deze aanmeldingen te laten gebruiken om te voorkomen dat u extra subsidies krijgt wanneer het schema wordt bijgewerkt, maar u verwijdert op deze manier een zeer nuttige vorm van bescherming. Gebruik de bovenstaande oplossing als u echt meerdere "admins" wilt, maar blijf bij het "gun alle privileges op alle tabellen in schema ..." hierboven voor het inloggen voor uw "normaal gebruik" -toepassing.


6
2017-12-17 01:43