请考虑以下示例:
超级用户admin在PostgreSQL数据库中执行以下命令:

CREATE DATABASE admindb;
CREATE ROLE dbo WITH CREATEDB CREATEROLE;
GRANT ALL PRIVILEGES ON DATABASE admindb TO dbo WITH GRANT OPTION;
CREATE ROLE user1 WITH LOGIN PASSWORD 'user1pw';
GRANT dbo TO user1;
ALTER ROLE user1 SET ROLE dbo;

在下一步中,user1执行以下操作:
psql -h 10.11.4.32 -d admindb -U user1
# creates a table in admindb database
CREATE TABLE test1 ( a INT, b INT);
# check pg_stat_activity

 datid | datname |  pid  | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | xact_start | query_start | state_change | wait_event_type | wait_event | state | backend_xid | backend_xmin | query
 17816 | admindb | 21314 |    17819 | user12  | psql             |             |                 |             |               |            |             |              |                 |            |       |             |          625 |<insufficient privilege>
(1 row)

请查看查询字段显示的权限不足。
如果在创建ALTER ROLE user1 SET ROLE dbo时未运行user1,则查询字段将正确显示它,如下所示。
 17816 | admindb | 18386 |    17819 | user12  | psql             | 192.168.0.12 |                 |       58794 | 2018-08-10 06:13:48.762903+00 | 2018-08-10 06:14:57.119916+00 | 2018-08-10 06:14:57.119916+00 | 2018-08-10 06:14:57.119917+00 |                 |            | active |             |          624 | select * from pg_stat_activity;
(1 row)

我想知道是什么导致了这种行为。
因此,如果user1运行一个长查询并试图通过使用psql连接到admindb作为user1并运行select pg_cancel_backend(pid)来取消它,则它将失败并返回错误。
ERROR:  must be a member of the role whose query is being canceled or member of pg_signal_backend

如果删除ALTER ROLE user1 SET ROLE dbo,则user1可以取消查询。

最佳答案

原因是连接后SET ROLE立即将活动用户上下文更改为dbo,但您的“会话用户”仍然是user1

SELECT current_user, session_user;

 current_user | session_user
--------------+--------------
 dbo          | user1
(1 row)

pg_stat_activity中,您只能看到会话用户等于当前活动用户的会话,pg_cancel_backendpg_terminate_backend只允许您影响会话用户等于当前用户的后端。
您可以执行RESET ROLE以还原到user1并执行这些操作。

关于postgresql - 角色与PostgreSQL中的pg_terminate_backend和/或pg_cancel_backend管理功能之间的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51780199/

10-13 05:20