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
相关产品推荐
相关产品推荐

