Amazon RDS 上 pg_terminate_backend 的权限

jul*_*icz 6 postgresql permissions rdbms amazon-web-services amazon-rds

abc在 Amazon RDS 上的 PostgreSQL 数据库上有一个用户。据我所知,该用户是超级用户:

=> grant rds_superuser to abc;
NOTICE:  role "abc" is already a member of role "rds_superuser" GRANT ROLE
Run Code Online (Sandbox Code Playgroud)

我尝试终止一些交易,但是我得到:

=> select pg_terminate_backend(pid) from pg_stat_activity;
ERROR:  must be superuser or have the same role to terminate other server processes
Run Code Online (Sandbox Code Playgroud)

我广泛搜索了 Amazon RDS 文档,但仍然不明白。我哪里出错了?

Cra*_*ger 4

亚马逊为其数据库管理员角色选择了一个令人困惑的名称。事实上,就 PostgreSQL 而言,它不是超级用户,您可以通过以下方式验证:

SHOW is_superuser;
Run Code Online (Sandbox Code Playgroud)

实际的 PostgreSQL 超级用户访问级别在 RDS 中不可用,因为它可以让您通过加载自己的代码、直接修改文件等方式“突破”数据库系统。

因此,您不能在 RDS 中使用仅限超级用户的函数,除非 AmazonSECURITY DEFINER为其提供包装函数,或者公开 AWS API 调用以让您间接调用该功能。

但是,在这种情况下,您只阅读了一半的错误消息:

错误:必须是超级用户或具有相同角色才能终止其他服务器进程

您的 SQL 尝试终止与数据库的每个连接,因为它没有WHERE子句。其中一些连接必须具有不同的用户角色,但您不是超级用户,所以您不能这样做。

不过,您仍然可以通过自己的用户名终止连接。