【问题标题】:get roles assigned to user in postgresql在postgresql中获取分配给用户的角色
【发布时间】:2017-11-12 20:14:51
【问题描述】:

我有一个 postgreSQl 数据库。我创建了几个数据库用户,并为每个用户分配了某些角色。在我的 python 程序中,我需要获取数据库的用户及其相应的角色。如何获取这些信息?

【问题讨论】:

    标签: python postgresql roles


    【解决方案1】:

    您可以对system catalogs 执行查询。尝试查看pg_userpg_roles 表。他们的架构是:

    test=# \d pg_user
         View "pg_catalog.pg_user"
        Column    |  Type   | Modifiers 
    --------------+---------+-----------
     usename      | name    | 
     usesysid     | oid     | 
     usecreatedb  | boolean | 
     usesuper     | boolean | 
     userepl      | boolean | 
     usebypassrls | boolean | 
     passwd       | text    | 
     valuntil     | abstime | 
     useconfig    | text[]  | 
    
    test=# \d pg_roles
                  View "pg_catalog.pg_roles"
         Column     |           Type           | Modifiers 
    ----------------+--------------------------+-----------
     rolname        | name                     | 
     rolsuper       | boolean                  | 
     rolinherit     | boolean                  | 
     rolcreaterole  | boolean                  | 
     rolcreatedb    | boolean                  | 
     rolcanlogin    | boolean                  | 
     rolreplication | boolean                  | 
     rolconnlimit   | integer                  | 
     rolpassword    | text                     | 
     rolvaliduntil  | timestamp with time zone | 
     rolbypassrls   | boolean                  | 
     rolconfig      | text[]                   | 
     oid            | oid                      | 
    

    假设您使用psycopg2 通过 Python 连接到数据库,您可以对系统目录表执行查询:

    import psycopg2
    
    conn = psycopg2.connect(database="test", user='postgres')
    cur = conn.cursor()
    cur.execute('select * from pg_catalog.pg_user')
    for row in cur.fetchall():
        print(row)
    
    cur.execute('select * from pg_catalog.pg_roles')
    for row in cur.fetchall():
        print(row)
    

    【讨论】:

    • 这列出了 DBMS 中的所有用户和角色。但是,不是具有相应角色的用户。
    • 但是这个方法只给了我用户和角色的列表。我需要具有相应角色的用户。我怎样才能实现它?
    • 这个程序有一些逻辑错误,这里是正确的程序...import psycopg2 conn = psycopg2.connect(database="postgres", user='postgres') cur = conn.cursor() cur.execute('select * from pg_catalog.pg_user') for row in cur.fetchall(): print(row) cur.execute('select * from pg_catalog.pg_roles') for row in cur.fetchall(): print(row)更正缩进。但是这个程序只给出了用户和角色的列表。而不是解决方案。
    • @Aravind:对表执行连接。
    【解决方案2】:

    这里是解决方案,通过将前一个程序的 2 个不同查询组合成一个基于 SQL WHERE 条件的单个查询(假设您正在 使用 psycopg2 通过 Python 连接到数据库

    import psycopg2
    conn = psycopg2.connect(database="postgres", user='postgres')
    cur = conn.cursor()
    cur.execute('SELECT usename,rolname FROM pg_user,pg_roles WHERE oid=usesysid;')
    #print ('users&roles')
    for row in cur.fetchall():
        print(row[0]+','+row[1])
    

    【讨论】:

    • 只是为了查看结果,我在数据库中创建了 4 个用户和 2 个角色,并将分配的角色授予 3 个用户。但是,我也可以在 pg_roles 表中看到用户。所以我得到的结果是user1,user1。不像 user1,role1
    • 尝试print(row) 而不是print(row[0]+','+row[1])。通过在 pgadmin 控制台上执行查询 SELECT usename,rolname FROM pg_user,pg_roles WHERE oid=usesysid; 来验证您的结果。
    • '('postgres', 'postgres') ('user1', 'user1') ('user2', 'user2') ('user3', 'user3') ('user4', 'user4')'.. 这是我得到的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2015-08-01
    • 2018-01-06
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多