Ahoj
jj. aclexplode() - vzdy existujici, donedavna ale nezdokumentovana a neznama funkce (viz stackoverflow priklady nabizejici rucni parsovani acl retezcu ;) )
Anyway, u aclexplode() je treba pamatovat na jednou vec.
Metarole public je na vystupu teto funkce identifikovana cislem 0 (zero). Takovy zaznam v pg_roles neexistuje. A to znamena par zajimavosti:
- Nutnost pouzivani LEFT JOIN pro joinovani pomoci role oid. Jinak vam utecou granty pro public metaroli
- 0::regrole - vraci pomlcku. Ttusim ze je to nejaky hardcodovana vyjimka, jinak by to spadlo s exception.
- SELECT to_regrole('public') - vraci NULL
Druha dulezita vec je, public meta role je zaregistrovana v postresu malymi pismeny. A to navzdory tomu ze vsude v dokumentaci ale i v information_schema se vyskytuje velkim pismenem.
To vede k dvem cevem:
- je treba si na to pamatovat pokud pouzijete zaznamy z information_schema spolu s quote_ident() nebo %I placeholder v format() funkci.
SELECT format('GRANT %s ON tabulka TO %I', privilege_type, grantee) FROM information_schema.role_table_grants -- spadne s chybou pro public meta roli - pokud nahodou nekdo vytvori roli PUBLIC velkym pismenem (malym nejde, velkim ano), tak v information_schema nepoznate, ktera role je metarole public a ktera PUBLIC ;)
PS. Chtel jsem o tom prednaset na P2D2 ale jsem se nevesel ;)
Michal Bartak