我正在构建一个应用程序,使用postgreSQL作为数据库。当我运行应用程序时,我打开dbeaver并输入SQL查询:
select * from pg_stat_activity
为了查看应用程序运行期间已处理的SQL查询列表。
在“查询”列中,对于某些查询,我得到了“权限不足”的提示。你知道我该怎么做才能看到实际的SQL查询吗?
我正在构建一个应用程序,使用postgreSQL作为数据库。当我运行应用程序时,我打开dbeaver并输入SQL查询:
select * from pg_stat_activity
GRANT pg_read_all_stats TO username;
要查看所有查询,您需要以root用户身份运行查询。通常使用的是postgres
用户。
在某些托管postgresql服务(如AWS)中,访问root用户受到限制,设计上不可能查看由该用户执行的查询。
一般来说,您的用户拥有的特权越多,您就可以在pg_stat_activity
中看到更多的查询。
您不必以root用户身份运行查询。将某人授予root用户访问权限可能会带来非常严重的安全隐患,因为他们可以做任何事情。有一种解决方法是,您可以创建一个作为root的函数,该函数具有对pg_stat_statements的访问权限,然后授予只读用户对该函数的访问权限。例如:
CREATE OR REPLACE FUNCTION your_schema.get_stat_statements(showtext boolean = true) RETURNS SETOF pg_stat_statements AS
$$
/* pganalyze-collector */ SELECT * FROM public.pg_stat_statements(showtext) LIMIT 100;
$$ LANGUAGE sql VOLATILE SECURITY DEFINER;
GRANT USAGE on SCHEMA your_schema TO your_readonly_user;
GRANT EXECUTE on FUNCTION your_schema.get_stat_statements(boolean) TO your_readonly_user;
解决这个问题的一个可能的方法是使用具有足够权限查看数据的用户定义一个MATERIALIZED VIEW
,并将对该视图的访问权限授予没有权限的用户。
其中一个缺点是需要定期使用REFRESH MATERIALIZED VIEW
刷新视图,也由视图所有者(或其他具有权限的用户)执行。