如何按用户组获取查询

时间:2018-07-09 02:15:59

标签: sql amazon-redshift

我想让Redshift数据库的特定用户组中的用户运行所有查询。这是我正在运行的查询:

select
  q.*,
  u.usename,
  swq.total_queue_time / 1000000 as queue_time
from stl_query q
  inner join pg_user u on q.userid = u.usesysid
  inner join pg_group g on u.usesysid = ANY (g.grolist)
  inner join stl_wlm_query swq on q.query = swq.query
where q.userid <> 1
      AND database = 'mydb'
      AND g.groname = 'ops'
order by q.starttime desc;

但是,我得到Column "g.grolist" has unsupported type "integer[]"。我尝试了其他形式的同一查询(例如,将ANY条件放在WHERE中),但我一直遇到相同的错误。如何检查pg_group的用户ID列表中是否出现用户ID?

1 个答案:

答案 0 :(得分:0)

我发现此Redshift guide具有array类型,这些类型包含在不受支持的PostgresSQL数据类型列表中,这导致您的SQL错误为column has unsupported type

Redshift并非完全是Postgres,因此不支持所有Postgres数据类型和功能。因此,最好参考redshift指南以了解您遇到的行为中的任何错误/差异。

  

在此处查找更多差异:Amazon Redshift and PostgreSQL

对于不受支持的数据类型,它指出:

  

如果查询尝试使用不受支持的数据类型,包括显式或隐式强制转换,它将返回错误。

但是redshift确实支持某些arrayjson-array函数,您可以使用这些函数来处理数组列类型。如下所示,查询将使用array_to_string输出您想要的结果。

select
  q.*,
  u.usename,
  swq.total_queue_time / 1000000 as queue_time
from stl_query q
  inner join pg_user u on q.userid = u.usesysid
  inner join pg_group g on array_to_string(g.grolist,',') like '%' || u.usesysid || '%'
  inner join stl_wlm_query swq on q.query = swq.query
where q.userid <> 1
      AND database = 'mydb'
      AND g.groname = 'ops'
order by q.starttime desc;