【问题标题】:redshift listagg on user permission query用户权限查询上的redshift listagg
【发布时间】:2021-08-24 05:59:11
【问题描述】:

我正在使用 listagg 对具有相同权限的用户进行分组,根据来自以下堆栈问题的查询,根据我的需要对其进行了一些调整。 How do I view grants on Redshift

这失败了,说 listagg 是计算节点函数,应该在用户创建的表上使用。有什么方法可以在目录表上使用 listagg 和 has_*_privilege 函数,这两个函数都在领导节点上运行?

with cte1 as (
SELECT *
FROM 
    (    SELECT 
        fullobj
        ,usename
        ,case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'select') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'S' else '' end ||  
        case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'insert') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'I' else '' end ||
        case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'update') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'U' else '' end ||
        case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'delete') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'D' else '' end ||
        case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'references') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'R' else '' end AS perm
    FROM
        (
        SELECT schemaname, 't' AS obj_type, tablename AS objectname, schemaname + '.' + tablename AS fullobj FROM pg_tables
        WHERE schemaname not in ('pg_internal')
        UNION
        SELECT schemaname, 'v' AS obj_type, viewname AS objectname, schemaname + '.' + viewname AS fullobj FROM pg_views
        WHERE schemaname not in ('pg_internal')
        ) AS objs
        ,(SELECT usename::text FROM pg_user) AS usrs
    ORDER BY fullobj
    ) WHERE perm != '')
select fullobj, perm, listagg(usename,',') from cte1 group by fullobj, perm;
SQL Error [500310] [XX000]: [Amazon](500310) Invalid operation: One or more of the used functions must be applied on at least one user created tables. Examples of user table only functions are LISTAGG, MEDIAN, PERCENTILE_CONT, etc;

我试图将查询输出存储在一个表中,但它不允许存储该表,因为 has_table_privilege 函数是leader-only函数

create  table user_perms as
SELECT *
FROM 
    (    SELECT 
        fullobj
        ,usename
        ,case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'select') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'S' else '' end ||  
        case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'insert') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'I' else '' end ||
        case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'update') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'U' else '' end ||
        case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'delete') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'D' else '' end ||
        case when HAS_TABLE_PRIVILEGE(usrs.usename, fullobj, 'references') AND has_schema_privilege(usrs.usename, schemaname, 'usage') then 'R' else '' end AS perm
    FROM
        (
        SELECT schemaname, 't' AS obj_type, tablename AS objectname, schemaname + '.' + tablename AS fullobj FROM pg_tables
        WHERE schemaname not in ('pg_internal')
        UNION
        SELECT schemaname, 'v' AS obj_type, viewname AS objectname, schemaname + '.' + viewname AS fullobj FROM pg_views
        WHERE schemaname not in ('pg_internal')
        ) AS objs
        ,(SELECT usename::text FROM pg_user) AS usrs
    ORDER BY fullobj
    ) WHERE perm != '';
SQL Error [500310] [0A000]: [Amazon](500310) Invalid operation: Specified types or functions (one per INFO message) not supported on Redshift tables.;

对于能够在领导节点函数/表上运行 listagg 的问题是否有任何解决方案?

【问题讨论】:

    标签: amazon-redshift


    【解决方案1】:

    没有。

    如您正确理解,listagg 是 Redshift 实现的函数,而不是继承自 Postgres/Paraccel,并且仅在工作节点上实现。

    has 函数来自 Postgres,仅在领导节点上实现。

    查询计划器不允许使用仅领导节点功能的查询来招募工作节点,因此您不能调用listagg

    (顺便说一句,如果我没记错的话,reltype 的 'v' 也会获取物化视图。)

    顺便说一句,您实际上可以直接从系统表中获取您要查找的信息,但这是一项漫长而复杂的工作。我是 Redshift 专家,第一个版本花了我两个月的时间,虽然我当时正在工作。

    【讨论】:

    • 感谢 Max 的回复,能否分享一下你的版本。
    • 抱歉,这是我打算在适当时候出售的产品(替换系统表)的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多