暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【GaussDB每日一贴】aclexplode函数的使用

原创 猪踢库 2025-03-23
44

查看数据库

在GaussDB中,如何查询一个用户对某个数据库的权限(比如能否连接数据库A,能否在数据库B中创建表)?

--先创建一个数据
gaussdb=# CREATE DATABASE dn_20;
CREATE DATABASE
复制

再进入该数据库创建数据对象

-- 进入数据库后创建数据对象
dn_20=> CREATE TABLE tbl_t1 AS SELECT * FROM pg_class LIMIT 20;
INSERT 0 20
dn_20=> \d
                         List of relations
 Schema |  Name  | Type  | Owner |             Storage
--------+--------+-------+-------+----------------------------------
 public | tbl_t1 | table | root  | {orientation=row,compression=no}
复制

再创建一个用户,并授权CONNECT,CREATE的权限:

dn_20=> CREATE USER user01 PASSWORD 'user01@1234';
CREATE ROLE
-- 做简单的授权
CREATE CONNECT,CREATE ON DATABASE dn_20 TO user01;
复制

通过pg_database表中datacl的这一列,可以看到该数据库的访问权限

gaussdb=# select datname,datacl from pg_database where datname='dn_20';
 datname |                         datacl
---------+---------------------------------------------------------
 dn_20   | {=Tc/rdsAdmin,rdsAdmin=CTc/rdsAdmin,user01=Cc/rdsAdmin}
(1 row)
复制

但是这样很不直观,可以使用aclexplode这个函数

gaussdb=# select datname,aclexplode(datacl) from pg_database where datname='dn_20';
 datname |      aclexplode
---------+----------------------
 dn_20   | (10,0,TEMPORARY,f)
 dn_20   | (10,0,CONNECT,f)
 dn_20   | (10,10,CREATE,f)
 dn_20   | (10,10,TEMPORARY,f)
 dn_20   | (10,10,CONNECT,f)
 dn_20   | (10,40975,CREATE,f)
 dn_20   | (10,40975,CONNECT,f)

--- 继续展开
gaussdb=# select datname,aclexplode(datacl).grantee, aclexplode(datacl).privilege_type from pg_database where datname='dn_20';
 datname | grantee | privilege_type
---------+---------+----------------
 dn_20   |       0 | TEMPORARY
 dn_20   |       0 | CONNECT
 dn_20   |      10 | CREATE
 dn_20   |      10 | TEMPORARY
 dn_20   |      10 | CONNECT
 dn_20   |   40975 | CREATE
 dn_20   |   40975 | CONNECT
复制

其中,grantee就是用户的oid,因此就能通过这个字段来关联用户表

SELECT pr.rolname,t.*
FROM
(select datname,aclexplode(datacl).grantee, 
 aclexplode(datacl).privilege_type 
 from pg_database )t,pg_roles pr
WHERE t.grantee=pr.oid and t.datname='dn_20';


 rolname  | datname | grantee | privilege_type
----------+---------+---------+----------------
 rdsAdmin | dn_20   |      10 | CREATE
 rdsAdmin | dn_20   |      10 | TEMPORARY
 rdsAdmin | dn_20   |      10 | CONNECT
 user01   | dn_20   |   40975 | CREATE
 user01   | dn_20   |   40975 | CONNECT
复制

这样就能看到用户对数据库所拥有的权限

查看模式的权限

同理也可以看到用户对schema的权限

-- 在数据库里创建schema
dn_20=> CREATE SCHEMA test20;
CREATE SCHEMA
dn_20=> GRANT USAGE ON SCHEMA test20 TO user01;
GRANT
复制

使用aclexplode函数得出具体权限

SELECT pr.rolname,t.*
FROM
 (select nspname,aclexplode(nspacl).privilege_type,aclexplode(nspacl).grantee from pg_namespace) t,pg_roles pr
 WHERE t.grantee=pr.oid
 AND t.nspname='test20';
 
 rolname | nspname | privilege_type | grantee
---------+---------+----------------+---------
 root    | test20  | USAGE          |   16776
 root    | test20  | CREATE         |   16776
 user01  | test20  | USAGE          |   40975
 
复制
最后修改时间:2025-03-23 20:35:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论