Od počátku seriálu o PostgreSQL jsme se přehoupli přes řadu 8.1, která změnila systém vytváření uživatelů a je zapotřebí se seznámit i se systémem vytváření skupin a s pokročilejší správou uživatelů. Ale protože se vyskytují i servery, jejichž správci jsou konzervativní v nasazování nových verzí, pokusíme se shrnout i odlišnosti starších verzí.
12.1.2007 10:00 | MaReK Olšavský | přečteno 19676×
Vytváření skupin uživatelů může předcházet vytvoření jednotlivých uživatelů, proto jej předřazuji samotnému vytvoření uživatelů. Práva k jednotlivým databázím a tabulkám totiž lze přiřazovat jednotlivým skupinám, i uživatelům, ale je mnohem přehlednější vytvořit skupinu, která má garantované určité přístupy, do níž se pak přidávají nově vytvoření uživatelé, než vytvářet uživatele mimo skupiny a těm pak jednotlivě přiřazovat potřebná práva. Je rozdíl mezi verzemi před 8.0, včetně, a v tom, jaké jsou změny od řady 8.1. To jak je systém přepracován od verze 8.1 naleznete v odstavcích dále a tuto část textu můžete přeskočit.
Nová skupina uživatelů se vytváří pomocí příkazu CREATE GROUP jmeno_skupiny [[WITH] volba [dalsi_volba]]
, kde volby a parametry jsou následující (ve verzi 7.4 nejsou tyto volby obsaženy):
-- ve verzi 8.0 SYSID gid USER uzivatelske_jmeno [, dalsi_uzivatel [, ...]]
Jedinými parametry jsou číslo skupiny (gid), které pokud nezadáte bude vygenerováno automaticky a členové skupiny, které však můžete přidávat později pomocí ALTER GROUP
.
Například při tvorbě účetního systému pro přístup ke klíčovým datům, při rozdělení na různých činností, které je běžné ve velkých firmách, budete mít skupiny správců, perzonalistů a účetních (i ty lze rozdělit na mzdové a finanční), do kterých pak budete přiřazovat jednotlivé uživatele, kteří pak budou mít přístup definovaný pouze k určitým databázím, tabulkám, či pohledům.
Změny ve skupinách se realizují pomocí příkazu ALTER USER
ve třech možných variantách.
-- pridani jednoho nebo vice uzivatelu do skupiny jmeno ALTER GROUP jmeno ADD USER uzivatel1 [, ...] -- odebrani jednoho nebo vice uzivatelu ze skupiny jmeno ALTER GROUP jmeno DROP USER uzivatel1 [, ...] -- prejmenovani skupiny, toto smi udelat pouze vlastnik db ALTER GROUP jmeno RENAME TO nove_jmeno
Pro smazání skupiny je, nejjednodušší a nejkratší, příkaz DROP GROUP jmeno
.
Od verze 8.1 jsou skupiny v tomto pojetí zrušeny, nejedná se o SQL standard, a je povoleno vytvářet pouze uživatele/role.
Stále platí, že pro vytvoření prvního uživatele musíte být přihlášeni jako hlavní uživatel postgres, a to ať z konzole/terminálu, nebo v rámci SQL příkazu, ale už zmizela jedna menší nelogičnost v právech vytváření uživatelů. Protože se snažím v seriálu postihnout vlastnosti řady 7 i aktuální 8, pokusíme se v tomto díle vysvětlit obě verze.
Z terminálu vytvoříte uživatele, pochopitelně, máte-li k tomu patřičná práva, příkazem createuser
, jehož přesné parametry naleznete buď vyvoláním nápovědy pomocí createuser --help
, případně s přesným popisem pomocí man createuser
, eventuálně v dokumentaci na stránkách PostgreSQL serveru, samozřejmě, že musíte otevřít dokumentaci k té verzi PgSQL, kterou používáte. Alespoň bodově si popíšeme změny:
Ostatní parametry zůstaly beze změny. Pokud nezadáte některý z podstatných parametrů, jako například má-li být superuživatelem, právo vytvářet databáze a další běžné uživatele, utilita createuser
se interaktivně vyptá na zbylé parametry.
Konzolový příkaz createuser
má svůj ekvivalent i v SQL příkazu, protože může být velmi užitečné moci vytvořit dalšího uživatele z aplikace, což by použitím konzolové utility nemuselo být vůbec snadné. Tento příkaz je CREATE USER jmeno_uzivatele [WITH volba [dalsi_volba]]
. Naprostým ekvivalentem a používaným se stejnými parametry je příkaz CREATE ROLE jmeno_uzivatele [WITH volba [dalsi_volba]]
. Parametry příkazu jsou víceméně samodokumentační, čiže by měl většině uživatelů postačit jejich prostý výpis, eventuálně lze nahládnout do dokumentace na stránkách PostgreSQL, v tomto díle popíšu jen ty volby, kde by mohli být nejasnosti.
Ve verzích 8.0 a starších byly parametry:
SYSID uid CREATEDB | NOCREATEDB CREATEUSER | NOCREATEUSER IN GROUP groupname [, ...] [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' VALID UNTIL 'abstime'
A od verze 8.1 jsou platné parametry:
SUPERUSER | NOSUPERUSER CREATEDB | NOCREATEDB CREATEROLE | NOCREATEROLE CREATEUSER | NOCREATEUSER INHERIT | NOINHERIT LOGIN | NOLOGIN CONNECTION LIMIT limit_spojeni [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'heslo' VALID UNTIL 'casovy_udaj' IN ROLE role [, ...] IN GROUP role [, ...] ROLE role [, ...] ADMIN role [, ...] USER role [, ...] SYSID uid
Opět není třeba zadávat všechny parametry, leč nebudete na vlastnosti nového uživatele interaktivně dotázáni, ale budou použity defaultní volby, které jsou defaultní stejně jako v případě konzolové varianty. Jak vidíte z výpisu možných parametrů, které jsou použitelné v SQL příkazu, tak možnosti jsou poněkudsi širší. Některé parametry si popíšeme v krátkém seznamu.
CREATE USER
bude přihlášení povolené i bez uvedení klauzule LOGIN
, ve všech ostatních případech bude výchozí volbou NOLOGIN
.IN ROLE
. Je označen jako zastaralý, takže nemusí časem být podporován.IN ROLE
, čiže při vytváření nové role vyjmenujete již existující, které do této budou zahrnuty. Stručněji, tímto vytvoříte skupinu a do ní zahrnete ať již existující skupiny, nebo existující uživatele.ROLE
. Je označen jako zastaralý, takže nemusí časem být podporován.ROLE
, ale uživatelé, které jste tímto zahrnuli budou mít administrátorská práva v této skupině.Již z popisu přepínačů je vidět, že role zcela nahrazují původní model uživatelů a skupin uživatelů. Pro někoho může být pochopitelnější a průhlednější původní systém, ale do Postgresu se dostávají takto veliké změny po velmi zralé úvaze, čiže se bude jednat opravdu o značně lepší systém ve správě uživatelů, především je vidět jeho lepší variabilita. Podstatné je, že od verze 8.1 je zapotřebí přestat uvažovat o uživatelích a skupinách, ale uvažovat o rolích, které jsou i ANSI SQL standardem.
Změna nastavení uživatelů se provádí příkazem ALTER USER jmeno [[WITH] volba [, dalsi_volba]]
, od verze 8.1, v terminologii rolí, se využívá funkce ALTER ROLE jmeno [[WITH] volba [, dalsi volba]]
Volby jsou téměř stejné jako při vytváření nového uživatele, jen jich několik chybí:
Do verze 8.0, včetně, jsou parametry:
CREATEDB | NOCREATEDB | CREATEUSER | NOCREATEUSER | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password' | VALID UNTIL 'abstime'
Od verze 8.1 platí následující parametry:
SUPERUSER | NOSUPERUSER CREATEDB | NOCREATEDB CREATEROLE | NOCREATEROLE CREATEUSER | NOCREATEUSER INHERIT | NOINHERIT LOGIN | NOLOGIN CONNECTION LIMIT limit_spojeni [ENCRYPTED | UNECRYPTED] PASSWORD 'heslo' VALID_UNTIL 'casovy_udaj'
V předchozích odstavcích jste se seznámili s vytvářením jednotlivých uřivatelů a skupin v PostgreSQL, nyní je zapotřebí vytvořeným rolím přiřadit práva na objekty v databázi. K delegování práv slouží příkaz GRANT
, s patřičnými parametry. Pokud na PostgreSQL přecházíte z MySQL, tento příkaz pravděpodobně znáte. Výpis všech parametrů příkazu naleznete
GRANT
poslouží k delegování práv k databázovým objektům pro jednotlivé role, ale pokud chceme tato práva odebrat, alespoň některá z nich, je třeba použít příkazu REVOKE
, který je opět popsán v původní dokumentaci na stránkách PostgreSQL, parametrů má poměrně mnoho.
-- hlavni role, ktera mi zastresuje cele mzdy CREATE ROLE amzdy NOLOGIN ENCRYPTED PASSWORD '123mzdy'; -- podrizene role CREATE ROLE pam NOLOGIN ENCRYPTED PASSWORD 'derf' IN ROLE amzdy; CREATE ROLE admin NOLOGIN ENCRYPTED PASSWORD 'fred' IN ROLE amzdy; -- Nyni uzivatele CREATE ROLE marek2 LOGIN ENCRYPTED PASSWORD 'm123' IN ROLE pam, admin; -- sebe davam jako (hlavniho) spravce do vsech roli CREATE ROLE jarsuk LOGIN ENCRYPTED PASSWORD 'jaro123'; -- zapomenuta role i s uzivateli CREATE ROLE mzdy NOLOGIN ENCRYPTED PASSWORD 'vyplaty' IN ROLE amzdy ROLE jarsuk, marek2; -- sobe pridelim veskera prava GRANT ALL ON DATABASE amzdy TO marek2 WITH GRANT OPTION; -- k mzdovym tabulkam (casti) pridam prava pro role mzdy a amzdy GRANT SELECT, INSERT, UPDATE, DELETE ON prac, nemd, mzdp, ucty TO amzdy, mzdy; -- uzivateli jarsuk odeberu prava mazani a prepisu REVOKE DELETE, UPDATE ON prac, nemd, mzdp, ucty FROM jarsuk;
V tomto díle jsem si dovolil udělat menší odbočku, která vznikla díky změně z PostgreSQL 7.2 na 8.1 na jednom serveru, o který se starám. Zpočátku se mi změna systému, od jednoduché terminologie skupin a uživatelů k rolím, příliž nelíbila, ale po vytvoření pár desítek rolí, z celkového počtu 120, jsem uznal, že tento systém je mnohem průhlednější a pružnější.
Příště se zase vrátíme k běžné manipulaci s daty a bude již načase otevřít možnosti programování na straně databáze, tj. uděláme krok k vícevrstvým aplikacím.