AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 285591
Accepted
Ουιλιαμ Αρκευα
Ουιλιαμ Αρκευα
Asked: 2021-02-18 19:39:55 +0800 CST2021-02-18 19:39:55 +0800 CST 2021-02-18 19:39:55 +0800 CST

如何在 PostgreSQL 上列出每个用户/角色的所有授权

  • 772

我在 Postgres CLI 上运行了这些语句(我使用的是 PostgreSQL v13.1):

CREATE ROLE blog_user;
GRANT blog_user TO current_user;

我创建了一个函数

CREATE FUNCTION SIGNUP(username TEXT, email TEXT, password TEXT)
RETURNS jwt_token AS
$$
DECLARE
  token_information jwt_token;
BEGIN
....
END;
$$ LANGUAGE PLPGSQL VOLATILE SECURITY DEFINER;

最后我授予了权限:

GRANT EXECUTE ON FUNCTION SIGNUP(username TEXT, email TEXT, password TEXT) TO anonymous;

我希望在我的模式/数据库中列出每个用户/角色的所有授权。\du并\du+显示基本信息,其中不包含有关最近进行的授权(在函数上执行)的信息。

postgresql permissions
  • 3 3 个回答
  • 10096 Views

3 个回答

  • Voted
  1. Best Answer
    gsiems
    2021-02-19T07:07:17+08:002021-02-19T07:07:17+08:00

    虽然以下不是一个完整的解决方案(不包括列 privs,它没有函数签名),但您应该希望能够获得您要求使用的大部分内容:

    SELECT rug.grantor,
            rug.grantee,
            rug.object_catalog,
            rug.object_schema,
            rug.object_name,
            rug.object_type,
            rug.privilege_type,
            rug.is_grantable,
            null::text AS with_hierarchy
        FROM information_schema.role_usage_grants rug
        WHERE rug.object_schema NOT IN ( 'pg_catalog', 'information_schema' )
            AND grantor <> grantee
    UNION
    SELECT rtg.grantor,
            rtg.grantee,
            rtg.table_catalog,
            rtg.table_schema,
            rtg.table_name,
            tab.table_type,
            rtg.privilege_type,
            rtg.is_grantable,
            rtg.with_hierarchy
        FROM information_schema.role_table_grants rtg
        LEFT JOIN information_schema.tables tab
            ON ( tab.table_catalog = rtg.table_catalog
                AND tab.table_schema = rtg.table_schema
                AND tab.table_name = rtg.table_name )
        WHERE rtg.table_schema NOT IN ( 'pg_catalog', 'information_schema' )
            AND grantor <> grantee
    UNION
    SELECT rrg.grantor,
            rrg.grantee,
            rrg.routine_catalog,
            rrg.routine_schema,
            rrg.routine_name,
            fcn.routine_type,
            rrg.privilege_type,
            rrg.is_grantable,
            null::text AS with_hierarchy
        FROM information_schema.role_routine_grants rrg
        LEFT JOIN information_schema.routines fcn
            ON ( fcn.routine_catalog = rrg.routine_catalog
                AND fcn.routine_schema = rrg.routine_schema
                AND fcn.routine_name = rrg.routine_name )
        WHERE rrg.specific_schema NOT IN ( 'pg_catalog', 'information_schema' )
            AND grantor <> grantee
    UNION
    SELECT rug.grantor,
            rug.grantee,
            rug.udt_catalog,
            rug.udt_schema,
            rug.udt_name,
            ''::text AS udt_type,
            rug.privilege_type,
            rug.is_grantable,
            null::text AS with_hierarchy
        FROM information_schema.role_udt_grants rug
        WHERE rug.udt_schema NOT IN ( 'pg_catalog', 'information_schema' )
            AND substr ( rug.udt_schema, 1, 3 ) <> 'pg_'
            AND grantor <> grantee ;
    
    • 7
  2. Laurenz Albe
    2021-02-18T22:51:56+08:002021-02-18T22:51:56+08:00

    在 PostgreSQL 中没有简单的方法可以做到这一点。您必须单独检查所有对象。

    • 1
  3. P. Qualis
    2022-02-09T08:22:37+08:002022-02-09T08:22:37+08:00

    这个查询回答了我同样的问题:如何知道 acl on function ?希望它可以提供帮助。

    SELECT
        routine_catalog AS fct_db,
        routine_schema  AS fct_sch,
        routine_name    AS fct_nam,
        privilege_type  AS fct_priv,
        array_agg (grantee::text ORDER BY grantee::text) AS fct_rol
    FROM
        information_schema.routine_privileges
    WHERE
        routine_schema NOT IN ('information_schema','pg_catalog')
    GROUP BY
        routine_catalog, routine_schema, routine_name, privilege_type
    ORDER BY
        routine_catalog, routine_schema, routine_name, privilege_type
    ;
    

    但是,如果函数具有相同的名称但参数不同,则效果不佳。例如dblink (text), dblink (text, boolean), dblink (text, text). 对于您的功能,您必须替换routine_schema NOT IN ('information_schema','pg_catalog')为routine_name = 'your_function_name'

    • -1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve