从Greenplum中查询用户名

本文介绍了如何使用SQL语句查询具有特定前缀的用户名及其属性,并通过CASE语句进行条件判断来获取用户的不同属性标识。
SELECT u.usename AS "User name",
  u.usesysid AS "User ID",
  CASE WHEN u.usesuper AND u.usecreatedb THEN CAST('superuser, create
database' AS pg_catalog.text)
       WHEN u.usesuper THEN CAST('superuser' AS pg_catalog.text)
       WHEN u.usecreatedb THEN CAST('create database' AS
pg_catalog.text)
       ELSE CAST('' AS pg_catalog.text)
  END AS "Attributes"
FROM pg_catalog.pg_user u
where u.usename like 'p_%'
ORDER BY 1;


<think>我们正在使用GreenplumDatabase6.20.5。要查询用户权限,通常涉及查询系统目录表。在Greenplum(基于PostgreSQL)中,权限信息存储在多个系统表中,例如pg_roles、pg_namespace、information_schema.table_privileges等。具体步骤:1.查询用户的基本信息(如创建时间、是否有超级用户权限等)可以通过pg_roles表。2.查询用户对数据库的权限可以通过pg_database表结合相关函数。3.查询用户对模式(schema)的权限可以通过pg_namespace表。4.查询用户对表的权限可以通过information_schema.table_privileges视图,或者直接查询pg_class结合pg_namespace和权限函数。但是,请注意,Greenplum中的权限分为多个层次:数据库、模式、表、视图、函数等。这里我们主要关注表级别的权限,因为这是最常见的需求。以下是一些常用查询:1.查询所有用户(角色)及其属性:```sqlSELECT*FROMpg_roles;```2.查询当前数据库中的所有模式及其所有者:```sqlSELECTnspnameASschema_name,rolnameASownerFROMpg_namespaceJOINpg_rolesONpg_namespace.nspowner=pg_roles.oid;```3.查询特定用户(例如用户名为'myuser')对数据库中所有表的权限:```sqlSELECTtable_schema,table_name,privilege_typeFROMinformation_schema.table_privilegesWHEREgrantee='myuser';```4.查询某个表(例如表名为'mytable')的权限分配情况:```sqlSELECTgrantee,privilege_typeFROMinformation_schema.table_privilegesWHEREtable_name='mytable';```5.查询用户拥有的数据库创建权限等:```sqlSELECTdatname,dataclFROMpg_database;```其中datacl是一个数组,记录了权限信息,可能需要解析。6.使用内置函数aclexplode可以更方便地展开权限数组(aclitem数组):```sqlSELECTgrantee,privilege_typeFROMpg_classJOINpg_namespaceONpg_namespace.oid=pg_class.relnamespace,aclexplode(relacl)WHERErelname='mytable'ANDnspname='public';```注意:aclexplode函数将aclitem数组展开为多条记录,每一条记录包含授权者、被授权者、权限类型等。然而,由于Greenplum是分布式数据库,其系统视图和函数与PostgreSQL基本一致,因此上述方法在Greenplum中同样适用。另外,Greenplum提供了一些额外的系统视图,例如pg_views(查询视图信息)、pg_tables(查询表信息)等,但权限信息主要还是通过上述方式查询。如果需要查询用户在整个集群中的权限(包括所有数据库),则需要在每个数据库中执行查询(因为系统表是每个数据库独立的)。或者,可以通过连接每个数据库来查询。为了简化,通常我们只关注当前数据库的权限。因此,针对你的问题,我建议使用以下步骤:1.连接到目标数据库。2.根据你要查询的权限层次(数据库、模式、表)选择上述查询之一。例如,要查询用户'myuser'在当前数据库中对所有表的权限,可以执行:```sqlSELECTtable_schema,table_name,privilege_typeFROMinformation_schema.table_privilegesWHEREgrantee='myuser';```注意:在Greenplum中,用户和角色是统一的,角色可以是一个用户,也可以是一个组。因此,如果用户属于某个组,那么该组的权限也会被继承。如果需要考虑组的权限,查询会更复杂一些,通常需要递归查询角色成员关系。关于角色成员关系的查询,可以使用以下方式:查询角色成员关系:```sqlSELECTrolname,memberofFROMpg_roles;```或者,使用递归查询来获取一个用户的所有直接和间接权限(包括组权限)是比较复杂的,通常需要借助递归CTE。由于问题只要求查询用户权限,我们可以先查询直接赋予该用户的权限,然后考虑其所属组的权限。但请注意,information_schema.table_privileges视图中,如果用户通过组获得权限,那么grantee显示的是组名,而不是用户名。因此,要看一个用户实际拥有的权限(包括组权限),需要将用户所属组的权限也查询出来。这里提供一个查询用户(直接和间接)拥有表权限的方法(使用递归CTE):```sqlWITHRECURSIVErAS(SELECToid,rolname,rolparentASparent_oidFROMpg_rolesWHERErolname='myuser'--指定用户名UNIONALLSELECTpg_roles.oid,pg_roles.rolname,pg_roles.rolparentFROMrJOINpg_rolesONpg_roles.oid=r.parent_oid)SELECTDISTINCTtable_schema,table_name,privilege_typeFROMinformation_schema.table_privilegesWHEREgranteeIN(SELECTrolnameFROMr);```注意:在Greenplum中,角色的继承关系是通过pg_roles.rolparent(父角色)字段表示的,但请注意,Greenplum6.x的pg_roles表中并没有rolparent字段,而是使用pg_auth_members表来表示角色成员关系。因此,上述递归查询需要调整。正确的角色成员关系查询(使用pg_auth_members):```sqlWITHRECURSIVErAS(SELECToid,rolnameFROMpg_rolesWHERErolname='myuser'UNIONALLSELECTm.roleid,r.rolnameFROMpg_auth_membersmJOINrONm.member=r.oid)--但是这样写不对,因为递归部分需要获取上级角色的名称--修正:递归查询应该从用户开始向上遍历其所属的组(角色)WITHRECURSIVEr(oid,rolname)AS(SELECToid,rolnameFROMpg_rolesWHERErolname='myuser'UNIONALLSELECTm.roleid,pg_role.rolnameFROMpg_auth_membersmJOINrONm.member=r.oidJOINpg_rolespg_roleONm.roleid=pg_role.oid)SELECTDISTINCTtable_schema,table_name,privilege_typeFROMinformation_schema.table_privilegesWHEREgranteeIN(SELECTrolnameFROMr);```但是,请注意:information_schema.table_privileges视图中,grantee是角色名(用户名或组名),因此我们查询了该用户以及其所有直接和间接所属组的权限。总结:在Greenplum6.20.5中,查询用户权限需要根据具体需求选择查询方式。对于表权限,使用information_schema.table_privileges视图比较方便。如果需要考虑角色继承,则需要使用递归CTE查询角色成员关系。另外,Greenplum官方文档中关于权限的部分可以参考:https://gpdb.docs.pivotal.io/6-20/security-guide/topics/Overview.html由于我们无法直接连接你的数据库,请根据实际情况调整用户名和对象名。如果你需要更详细的帮助,请提供具体的用户名和你想查询的权限类型(如表、模式等)。</think>在 Greenplum Database 6.20.5 中查询用户权限,主要通过系统目录表和 SQL 命令实现。以下是几种常用方法: ### 一、查询用户全局权限 ```sql -- 查询所有用户的基本权限(超级用户、创建角色、创建DB等) SELECT rolname AS username, rolsuper AS is_superuser, rolcreaterole AS can_create_roles, rolcreatedb AS can_create_db FROM pg_roles; ``` ### 二、查询数据库级权限 ```sql -- 查询特定用户(如 user1)在数据库(如 db1)中的权限 SELECT datname AS database, pg_get_userbyid(datdba) AS owner, CASE WHEN has_database_privilege('user1', oid, 'CONNECT') THEN 'CONNECT' WHEN has_database_privilege('user1', oid, 'CREATE') THEN 'CREATE' ELSE 'NONE' END AS privileges FROM pg_database WHERE datname = 'db1'; ``` ### 三、查询模式(SCHEMA)权限 ```sql -- 查询用户在特定模式(如 schema1)的权限 SELECT nspname AS schema_name, privilege_type FROM information_schema.schema_privileges WHERE grantee = 'user1' AND table_schema = 'schema1'; ``` ### 四、查询表/视图权限(最常用) ```sql -- 查询用户对所有表的权限 SELECT table_schema, table_name, privilege_type FROM information_schema.table_privileges WHERE grantee = 'user1'; ``` ### 五、查询函数权限 ```sql -- 查询用户对函数的执行权限 SELECT proname AS function_name, nspname AS schema, proacl AS privileges FROM pg_proc JOIN pg_namespace ON pg_namespace.oid = pronamespace WHERE proacl::text ~ 'user1'; ``` ### 六、使用元命令(psql 命令行) ```sql -- 列出所有角色 \du -- 看特定用户权限 \du user1 -- 看表权限 \dp schema1.table1 ``` ### 关键说明: 1. **权限类型说明**: - `SELECT`/`INSERT`/`UPDATE`/`DELETE`:表操作权限 - `USAGE`:模式使用权限 - `EXECUTE`:函数执行权限 - `CONNECT`:数据库连接权限 - `TEMPORARY`:创建临时表权限 2. **权限继承**: - 用户自动继承所属角色的权限 - 通过 `pg_auth_members` 表可角色继承关系: ```sql SELECT rolname AS role, member AS member_userid, (SELECT rolname FROM pg_roles WHERE oid = m.member) AS member_name FROM pg_auth_members m JOIN pg_roles r ON r.oid = m.roleid; ``` 3. **特殊权限**: - 超级用户权限通过 `pg_roles.rolsuper` 字段标识 - 对象所有者自动拥有所有权限 > **重要提示**:执行权限查询需使用管理员账号(如 `gpadmin`)或具有 `SELECT` 权限的账号。生产环境建议通过 `pgAdmin` 或 `DBeaver` 等可视化工具操作[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值