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
SELECT
práva k těmto objektům aUSAGE
práva na všechna schémata, i když je nemají výslovně. Tato role nemá atribut roleBYPASSRLS
soubor. Pokud se používá RLS, správce může chtít nastavitBYPASSRLS
u rolí, u kterých je tato roleGRANT
ed to.
pg_write_all_data
Zapište všechna data (tabulky, pohledy, sekvence), jako byste měli
INSERT
,UPDATE
aDELETE
práva na tyto objekty aUSAGE
práva na všechna schémata, a to i bez toho, že by je měli výslovně. Tato role nemá atribut roleBYPASSRLS
soubor. Pokud se používá RLS, správce může chtít nastavitBYPASSRLS
na rolích, pro které je tato roleGRANT
ed 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.