You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure PostgreSQL弹性服务器PgHero执行pg_stat_statements_reset权限拒绝问题

解决方案

1. 确认Rake任务使用的数据库用户

检查config/database.yml配置,确认执行Rake任务时连接数据库的用户(通常是应用的数据库用户,而非pghero用户)。假设该用户为app_user,执行以下SQL授予权限:

GRANT EXECUTE ON FUNCTION pghero.pg_stat_statements_reset(oid, oid, bigint) TO app_user;

2. 验证SECURITY DEFINER函数的定义者权限

Azure PostgreSQL Flexible Server中,public.pg_stat_statements_reset默认仅服务器管理员用户可执行。确保你的pghero.pg_stat_statements_reset函数由服务器管理员创建:

  • 查看函数定义者:
    SELECT proname, rolname FROM pg_proc JOIN pg_roles ON pg_proc.proowner = pg_roles.oid WHERE proname = 'pg_stat_statements_reset' AND schemaname = 'pghero';
    
  • 如果定义者不是服务器管理员,使用服务器管理员用户重新创建函数:
    CREATE OR REPLACE FUNCTION pghero.pg_stat_statements_reset(userid oid, dbid oid, queryid bigint) RETURNS void AS
    $$
      SELECT public.pg_stat_statements_reset(userid, dbid, queryid);
    $$ LANGUAGE sql VOLATILE SECURITY DEFINER;
    

3. 修复函数的搜索路径

SECURITY DEFINER函数可能因搜索路径问题无法找到public.pg_stat_statements_reset,修改函数添加明确的搜索路径:

CREATE OR REPLACE FUNCTION pghero.pg_stat_statements_reset(userid oid, dbid oid, queryid bigint) RETURNS void AS
$$
  SELECT public.pg_stat_statements_reset(userid, dbid, queryid);
$$ LANGUAGE sql VOLATILE SECURITY DEFINER
SET search_path = public;

4. 确认pg_stat_statements扩展已启用

执行以下SQL检查扩展状态:

SELECT extname FROM pg_extension WHERE extname = 'pg_stat_statements';

若未启用,使用服务器管理员用户执行:

CREATE EXTENSION pg_stat_statements;

完成以上步骤后,重新执行bin/rake pghero:capture_query_stats即可解决权限问题。

内容的提问来源于stack exchange,提问作者Fotis Papadamis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:35:12