如何让普通用户也能愉快地分析Greenplum实时查询?

简介: 这是由于pgstatactivity是一张系统视图,普通用户是没权限查看到其他用户全部的任务信息的。

这是由于pg_stat_activity是一张系统视图,普通用户是没权限查看到其他用户全部的任务信息的。

背景

在上一篇文章中,我们学习了如何使用pg_stat_activity,但在实际运用中发现,这张视图只有superuser才能愉快地使用,当使用普通用户去操作时会发生如下的情况:

dy_test=> SELECT pid, datname, usename, query FROM pg_stat_activity;
  pid  |  datname  |   usename    |                           query                            
-------+-----------+--------------+------------------------------------------------------------
 27116 | gpperfmon | gpadmincloud | <insufficient privilege>
 22999 | gpperfmon | gpadmincloud | <insufficient privilege>
 10706 | dy_test   | dy1          | SELECT pid, datname, usename, query FROM pg_stat_activity;
 21222 | test      | johnjing     | <insufficient privilege>
 21407 | dy_test   | dy2          | <insufficient privilege>
 21591 | dy_test   | dy3          | <insufficient privilege>
 13308 | dy_test   | gpadmincloud | <insufficient privilege>
 22106 | test      | gpadmincloud | <insufficient privilege>
(8 rows)

这是由于pg_stat_activity是一张系统视图,普通用户是没权限查看到其他用户全部的任务信息的。但是现实使用中又有这种需求,那么该如何解决呢?有两个方案可以实现。

解决方案

方案一:将普通用户赋予superuser的角色权限

dy_test=# ALTER USER dy WITH SUPERUSER;
ALTER ROLE
dy_test=# 
dy_test=# \du
                                                            List of roles
   Role name   |                                                Attributes                                                | Member of 
---------------+----------------------------------------------------------------------------------------------------------+-----------
 dy            | Superuser                                                                                                | {
   }
 dy1           |                                                                                                          | {
   }
 dy2           |                                                                                                          | {
   }
 dy3           |                                                                                                          | {
   }
 gpadmincloud  | Superuser, Create role, Create DB, Ext gpfdist Table, Wri Ext gpfdist Table, Ext http Table, Replication | {
   }
 gpmon         | Superuser, Create DB                                                                                     | {
   }
 johnjing      | Create role, Create DB, Ext gpfdist Table                                                                | {
   }
 johnjing_test | Cannot login                                                                                             | {
   }

此方案虽然可行,但是失去了普通用户的意义,且有较高风险,需谨慎选择。

方案二:使用SECURITY DEFINER函数来实现对pg_stat_activity的查询

1)创建SECURITY DEFINER函数

dy_test=# CREATE OR REPLACE FUNCTION pg_catalog.pg_stat_activity() RETURNS setof pg_catalog.pg_stat_activity AS 
dy_test-# $body$ 
dy_test$# DECLARE 
dy_test$#     result record; 
dy_test$# BEGIN 
dy_test$# for result in select * from pg_catalog.pg_stat_activity
dy_test$# loop 
dy_test$#    return next result; 
dy_test$# end loop; 
dy_test$# return; 
dy_test$# END; 
dy_test$# $body$ 
dy_test-# LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY DEFINER;
CREATE FUNCTION

2)将函数授权给用户

postgres=# REVOKE ALL ON FUNCTION pg_catalog.pg_stat_activity() FROM PUBLIC;
REVOKE
postgres=# GRANT EXECUTE ON FUNCTION pg_catalog.pg_stat_activity() TO dy1;
GRANT

3)作为对比,先使用普通用户查询pg_stat_activity系统视图表

dy_test=> SELECT usename 用户,
dy_test->         client_addr 请求源IP,
dy_test->         query 执行SQL,
dy_test->         current_timestamp - query_start AS 执行时长,
dy_test->         state 运行状态
dy_test->  FROM pg_catalog.pg_stat_activity;
     用户     |  请求源ip    |                       执行sql                        | 执行时长 | 运行状态 
--------------+-------------+------------------------------------------------------+----------+----------
 gpadmincloud |             | <insufficient privilege>                             |          | 
 gpadmincloud |             | <insufficient privilege>                             |          | 
 dy1          | 10.0.26.169 | SELECT usename 账号,                                +| 00:00:00 | active
              |             |         client_addr 请求源IP,                       +|          | 
              |             |         query 执行SQL,                              +|          | 
              |             |         current_timestamp - query_start AS 执行时长,+|          | 
              |             |         state 运行状态                              +|          | 
              |             |  FROM pg_catalog.pg_stat_activity;                   |          | 
 dy2          |             | <insufficient privilege>                             |          | 
 dy3          |             | <insufficient privilege>                             |          | 
(5 rows)

可以看到,当查询结果是其他用户时,这里很多信息是看不到的,或者为。

4)再使用普通用户查询pg_stat_activity()函数

dy_test=> SELECT usename 用户,
dy_test->         client_addr 请求源IP,
dy_test->         query 执行SQL,
dy_test->         current_timestamp - query_start AS 执行时长,
dy_test->         state 运行状态
dy_test->  FROM pg_catalog.pg_stat_activity();
     用户     |  请求源ip    |                       执行sql                        |    执行时长     | 运行状态 
--------------+-------------+------------------------------------------------------+-----------------+----------
 gpadmincloud | ::1         | select count(*) from pg_stat_activity where 1=1      | 00:00:09.907866 | idle
 gpadmincloud | ::1         | select count(*) from pg_stat_activity where 1=1      | 00:00:09.904608 | idle
 dy1          | 10.0.26.169 | SELECT usename 用户,                                +| 00:00:00        | active
              |             |         client_addr 请求源IP,                       +|                 | 
              |             |         query 执行SQL,                              +|                 | 
              |             |         current_timestamp - query_start AS 执行时长,+|                 | 
              |             |         state 运行状态                              +|                 | 
              |             |  FROM pg_catalog.pg_stat_activity();                 |                 | 
 dy2          | 10.0.26.169 | SELECT COUNT(1) FROM test_timestamp;                 | 00:05:57.229775 | idle
 dy3          | 10.0.26.169 | SELECT * FROM test_u0001_head;                       | 00:05:09.078105 | idle
(5 rows)

至此,普通用户也能愉快地使用pg_stat_activity了。

目录
相关文章
|
28天前
|
存储 弹性计算 人工智能
阿里云服务器ECS是什么?介绍、优势、创建流程及使用教程
阿里云ECS是高性能、高可用的弹性云服务器,支持分钟级创建、灵活升降配与全球部署。依托自研CIPU架构,单实例SLA达99.975%,网络延迟低至8微秒,适配网站托管、AI训练、数据库等全场景需求。(239字)
|
28天前
|
运维 调度
数字员工任务中断怎么办:失败分型、断点续跑与幂等重跑
把重复劳动交给数字员工之后,工程上绕不开一个问题:任务跑到一半中断了怎么办。这篇文章给一套实操框架,先做中断分型,再谈怎么让它可观测,最后谈怎么恢复,三步之外加一道结果校验兜底。
215 8
|
2月前
|
SQL 人工智能 JSON
【数据开发】字段怎么算、改了影响谁?我做了一个能直接问 AI 的 SQL 血缘工具
Scope Lineage 是一款面向 Spark/Hive SQL 的开源字段级血缘分析工具,支持静态解析、AI 问答与自动 mapping 文档生成,精准追踪字段来源、加工逻辑及影响范围,大幅提升数仓开发与治理效率。(239字)
170 2
【数据开发】字段怎么算、改了影响谁?我做了一个能直接问 AI 的 SQL 血缘工具
|
2月前
|
机器学习/深度学习 编解码 自动驾驶
行人细分目标检测数据集:3类别、4,000张图像 | 目标检测
本数据集含4000张真实道路图像,创新性地将行人细分为三类:pedestrian(行为行人)、ped(旁观人员)、people(人群),支持YOLO等模型训练,专为提升自动驾驶中行人语义理解与风险决策能力而设计。(239字)
209 1
|
2月前
|
数据采集 API
个税缴款接口-个税全员全额申报接口-个税申报API-个人所得税申报接口介绍
该API打通企业与各省电子税务局,支持个税申报、缴款、完税证明下载等全流程自动化。告别客户端登录、多账号切换与人工操作,实现批量报送、自动算税、跨区域申报及实时结果查询,大幅提升合规性与人效。
234 0
个税缴款接口-个税全员全额申报接口-个税申报API-个人所得税申报接口介绍
|
2月前
|
SQL 人工智能 自然语言处理
数据治理工具:全链路一体化架构
瓴羊Dataphin是阿里旗下全链路一体化智能数据治理平台,融合OneData方法论与AI原生能力,支持50+数据源、多引擎兼容及混合云部署,实现集成、建模、治理、服务闭环,显著提升数据生产力。
|
2月前
|
SQL 分布式计算 大数据
数据工程师为什么越做越值钱?一份从入门到高级的数据工程技能树、项目实战与简历升级指南
数据工程师为什么越做越值钱?一份从入门到高级的数据工程技能树、项目实战与简历升级指南
323 1
|
2月前
|
人工智能 监控 供应链
2026秋招“最难”是假象——测试开发岗需求激增30%,大厂薪资包涨了15%还在抢人
2026秋招测试岗冰火两重天:手工测试萎缩70%,测试开发需求暴增340%!本文揭示岗位重构真相——从“点点点找Bug”升级为“建系统控风险”,详解五层能力跃迁路径与AI时代避坑指南,助你抢占质量效能新赛道。
|
2月前
|
供应链 前端开发 JavaScript
开发一套成熟的ERP系统,到底需要掌握哪些技术?
本文系统解析ERP开发全栈技术体系,涵盖Java/.NET后端、Vue/React前端、MySQL/Oracle数据库、工作流引擎、多系统集成及财务/供应链等核心业务逻辑,强调数据一致性、流程闭环与财务合规,助力开发者掌握企业级数字化系统开发能力。
281 0
|
2月前
|
SQL 人工智能 关系型数据库
实测四大AI模型写SQL,表现差距不小
基于2026年8月已公开的主流模型版本(GPT-5.5、Claude Opus 4.7、Qwen3、Kimi k2.6),实测四个真实业务SQL场景。深入分析基准测试与真实场景的鸿沟、SQL幻觉根因,从准确性、可读性、性能三维度给出量化测评。