ट्रिक यह है कि सिस्टम कैटलॉग संबंधों पर एक पुनरावर्ती क्वेरी बनाई जाए pg_roles
और pg_auth_members
:
WITH RECURSIVE membership_tree(grpid, userid) AS (
-- Get all roles and list them as their own group as well
SELECT pg_roles.oid, pg_roles.oid
FROM pg_roles
UNION ALL
-- Now add all group membership
SELECT m_1.roleid, t_1.userid
FROM pg_auth_members m_1, membership_tree t_1
WHERE m_1.member = t_1.grpid
)
SELECT DISTINCT t.userid, r.rolname AS usrname, t.grpid, m.rolname AS grpname
FROM membership_tree t, pg_roles r, pg_roles m
WHERE t.grpid = m.oid AND t.userid = r.oid
ORDER BY r.rolname, m.rolname;
यह सिस्टम के सभी उपयोगकर्ताओं को सभी विरासत में मिली भूमिका सदस्यता के साथ एक दृश्य देता है। इस उपयोगिता को हमेशा काम में रखने के लिए इसे लपेटें।
चीयर्स, पैट्रिक