it-swarm-eu.dev

V Postgresu bylo povolení odepřeno

Do Postgresu jsem přidal uživatele myuser.

Poté jsem přidal databázi mydatabase do GUI pgAdmin III a obnovil ze záložního souboru. Vlastníkem mydatabase je tedy superuživatel postgres.

Pak jsem se pokusil dát všechna práva na přístup a upravit mydatabase na myuser. Přihlásil jsem se jako uživatel psql jako uživatel postgres:

psql -d template1 -U postgres  

a pak jsem spustil tento dotaz:

GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser

Nyní mohu použít myuser k přihlášení, ale pokud zkusím jednoduchý dotaz, dostanu tuto chybu:

ERROR:  permission denied for relation table_name

Uniká mi něco? Můžete mi to vyřešit?

30
Aslan986

Udělili jste oprávnění CREATE, CONNECT a TEMPORARY v databázi uživateli myuser ale dosud jste neudělili oprávnění tabulky SELECT a INSERT. Budete potřebovat něco jako:

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

Kromě toho budete potřebovat oprávnění k sekvencím , pokud máte nějaké sériové sloupce nebo jiné výchozí hodnoty sloupců čerpané ze sekvencí. Obecně je oprávnění USAGE dostatečné pro operace INSERT, ale protože jste požádali o "give all rights":

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;

Podrobnosti o GRANT v manuálu.

35
Gord Thompson

Použijte příkaz dodaný @Gord pro již existující objekty .

Pravděpodobně budete chtít udělit DEFAULT PRIVILEGES . Takže váš uživatel myuser má také automatický přístup k budoucím objektům.

Lze provést podle schématu :

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser;

Pokud schéma vynecháte, vztahuje se na celou databázi:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser;

Platí pouze pro objekty vytvořené zadanou rolí (výchozí pro roli, která provádí tento příkaz):

ALTER DEFAULT PRIVILEGES FOR ROLE administrator GRANT IN SCHEMA public ... ;

K dispozici od PostgreSQL 9.0.
Nezapomeňte také GRANT oprávnění k SEQUENCES navíc, pokud máte nějaké. (Například jako zdroj pro výchozí hodnoty v sériovém sloupci.)

11

Zatímco ostatní odpovědi na tuto otázku jsou správné, dovolte mi navrhnout jinou možnost. Po obnovení databáze budete moci ovládat uživatele, kterým je databáze obnovena. Nejsem si jistý, jak to udělat s pgAdmin3, ale obslužné programy pg_dump a pg_restore obsahují konkrétní možnosti, které to umožní.

Pokud používáte pg_dump --no-owner pak soubor výpisu nebude zahrnovat žádné obnovení vlastnictví. Když obnovíte výpis vytvořený pomocí --no-owner, uživatel, který jste použili k obnovení, bude vlastnit všechny objekty. Pokud máte soubor výpisu vlastního formátu a používáte pg_restore, můžete použít --no-owner možnost s pg_restore, aby při obnově databáze přeskočilo jakékoli obnovení vlastnictví.

Všimněte si, že to bude vyžadovat, aby uživatel provádějící obnovu měl potřebná práva k databázi, aby vytvořil objekty, které existují v souboru výpisu. Obecně lze říci, že udělení „CREATE“ na úrovni databáze uživateli provádějícímu obnovu bude stačit.

2
Stephen Frost