请考虑以下示例:
超级用户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_backend
和pg_terminate_backend
只允许您影响会话用户等于当前用户的后端。您可以执行
RESET ROLE
以还原到user1
并执行这些操作。关于postgresql - 角色与PostgreSQL中的pg_terminate_backend和/或pg_cancel_backend管理功能之间的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51780199/