PostgreSQL查询对象权限


一、PostgreSQL查询表权限

1.1、pg_class的relacl

根据pg_class的relacl字段来查权限:

SELECT owner
      ,relname as object_name,grantor,grantee
      ,CASE
         WHEN (t.privilege = 'r'::text) THEN 'SELECT'::text
         WHEN (t.privilege = 'a'::text) THEN 'INSERT'::text
         WHEN (t.privilege = 'd'::text) THEN 'DELETE'::text
         WHEN (t.privilege = 'w'::text) THEN 'UPDATE'::text
         WHEN (t.privilege = 'D'::text) THEN 'TRUNCATE'::text
         WHEN (t.privilege = 'X'::text) THEN 'EXECUTE'::text
         WHEN (t.privilege = 'x'::text) THEN 'REFERENCES'::text
         WHEN (t.privilege = 'U'::text) THEN 'USAGE'::text
         WHEN (t.privilege = 't'::text) THEN 'TRIGGER'::text
         WHEN (t.privilege = 'C'::text) THEN 'CREATE'::text
         WHEN (t.privilege = 'c'::text) THEN 'CONNECT'::text
         WHEN (t.privilege = 'T'::text) THEN 'TEMPORARY'::text
         ELSE t.privilege
        END AS privilege
  FROM (select CASE 
                 WHEN grantee IS NOT NULL AND grantee!=''
                   THEN has_table_privilege(grantee, oid, 'TRUNCATE')
                 ELSE NULL
               END AS TRUNCATE_privs
              ,regexp_split_to_table(privs, ''::text) AS privilege
              ,t.* 
          from (select (regexp_split_to_array(unnest(relacl)::text,'=|/'))[1] as grantee
                      ,(regexp_split_to_array(unnest(relacl)::text,'=|/'))[2] as privs
                      ,(regexp_split_to_array(unnest(relacl)::text,'=|/'))[3] as grantor
                      ,relname
                      ,relacl
                      ,(select usename from pg_user where usesysid = c.relowner) as owner
                      ,(SELECT nspname FROM pg_namespace n WHERE n.oid = c.relnamespace) as nspname
                      ,c.oid
                  FROM pg_class c
                 WHERE 1=1 
                   AND relkind in ('r','p','P')
                 order by owner,relname
        ) t
        WHERE GRANTOR <> GRANTEE
          AND GRANTEE <> ''
) t;

ACL 权限详解

pg_class的relacl中的权限,详细说明如下:
在这里插入图片描述

1.2、information_schema.table_privileges的privilege_type

根据系统视图information_schema.table_privileges查询某个schema下的某个表的权限:

select * 
  from information_schema.table_privileges
 where table_schema = 'tzq'
   and table_name = 'tzq_bas_bank_account_pay_ti'
   and grantor <> grantee;

在这里插入图片描述

二、PostgreSQL查询某个角色在数据库中的权限

PostgreSQL查询某个角色在数据库中的权限,查询SQL如下:

SELECT rolname
      ,rolcreatedb
      ,rolcanlogin
      ,rolvaliduntil
  FROM pg_roles
 WHERE rolname = 'tzq' -- role_name
 ;

在这里插入图片描述

三、PostgreSQL查询某个角色在某个表中的权限

其中,‘table_name’ 是需要查询的表名,‘schema_name’ 是表所在的模式名,‘role_name’ 是需要查询的角色名。查询结果将返回该角色在该表中的读取权限。

SELECT relname
      ,array_to_string(relacl
                      ,E'\n') AS permissions
  FROM pg_class
 WHERE relname = 'tzq_bas_bank_account_pay_ti' -- table_name
   AND relkind in ( 'r','p')
   AND relnamespace IN
       (SELECT OID FROM pg_namespace WHERE nspname = 'tzq') -- schema_name
   AND has_table_privilege('tzq' -- role_name
                          ,OID
                          ,'SELECT');

在这里插入图片描述

四、PostgreSQL查询某个角色在某个架构(Schema)中的权限

其中,‘schema_name’ 是需要查询的架构名,‘role_name’ 是需要查询的角色名。查询结果将返回该角色在该架构中的创建权限。

SELECT nspname
      ,array_to_string(nspacl
                      ,E'\n') AS permissions
  FROM pg_namespace
 WHERE nspname = 'tzq' -- schema_name
   AND has_schema_privilege('tzq' -- role_name
                           ,OID
                           ,'CREATE');

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tzq@2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值