Všechny příkazy musí být provedeny při připojení ke správnému databázovému clusteru. Ujistěte se.
Role jsou objekty databázového klastru . Všechny databáze stejného clusteru sdílejí sadu definovaných rolí. Oprávnění se udělují / odvolávají pro každou databázi / schéma / tabulku atd.
Role potřebuje přístup k databázi , očividně. To je uděleno PUBLIC ve výchozím stavu. Jinak:
GRANT CONNECT ON DATABASE my_db TO my_user;
Základní oprávnění pro Postgres 14 nebo novější
Postgres 14 přidává předdefinované role bez přihlášení pg_read_all_data / pg_write_all_data .
Mají SELECT / INSERT , UPDATE , DELETE oprávnění pro všechny tabulky, pohledy a sekvence. Plus USAGE na schématech. Můžeme GRANT členství v těchto rolích:
GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;
To pokrývá všechny základní příkazy DML (ale ne DDL a ne některé speciální příkazy jako TRUNCATE nebo EXECUTE oprávnění k funkcím!). Manuál:
pg_read_all_dataČtěte všechna data (tabulky, pohledy, sekvence), jako byste měli
SELECTpráva k těmto objektům aUSAGEpráva na všechna schémata, i když je nemají výslovně. Tato role nemá atribut roleBYPASSRLSsoubor. Pokud se používá RLS, správce může chtít nastavitBYPASSRLSu rolí, u kterých je tato roleGRANTed to.
pg_write_all_dataZapište všechna data (tabulky, pohledy, sekvence), jako byste měli
INSERT,UPDATEaDELETEpráva na tyto objekty aUSAGEpráva na všechna schémata, a to i bez toho, že by je měli výslovně. Tato role nemá atribut roleBYPASSRLSsoubor. Pokud se používá RLS, správce může chtít nastavitBYPASSRLSna rolích, pro které je tato roleGRANTed to.
Všechna oprávnění bez použití předdefinovaných rolí (jakákoli verze Postgres)
Příkazy je nutné provádět při připojení ke správné databázi. Ujistěte se.
Role potřebuje (alespoň) USAGE oprávnění na schéma . Znovu, pokud je to uděleno PUBLIC , jste kryti. Jinak:
GRANT USAGE ON SCHEMA public TO my_user;
Nebo udělte USAGE na všech vlastní schémata:
DO
$$
BEGIN
-- RAISE NOTICE '%', ( -- use instead of EXECUTE to see generated commands
EXECUTE (
SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
FROM pg_namespace
WHERE nspname <> 'information_schema' -- exclude information schema and ...
AND nspname NOT LIKE 'pg\_%' -- ... system schemas
);
END
$$;
Poté všechna oprávnění pro všechny tabulky (vyžaduje Postgres 9.0 nebo později).
A nezapomeňte na sekvence (pokud existuje):
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;
Alternativně můžete pro práci s GUI použít "Grant Wizard" z pgAdmin 4.
Existují některé další objekty, manuál pro GRANT má kompletní seznam. Od Postgres 12:
oprávnění k databázovému objektu (tabulka, sloupec, pohled, cizí tabulka, sekvence, databáze, obal cizích dat, cizí server, funkce, procedura, procedurální jazyk, schéma nebo tabulkový prostor)
Zbytek je ale potřeba jen zřídka. Další podrobnosti:
- Jak spravovat VÝCHOZÍ PRIVILEGIE pro UŽIVATELE v DATABÁZI vs. SCHÉMA?
- Udělte oprávnění pro konkrétní databázi v PostgreSQL
- Jak udělit všechna oprávnění k zobrazení libovolnému uživateli
Zvažte upgrade na aktuální verzi.