Postgresql 目录表上的权限不会被撤销
使用Postgresql 目录表上的权限不会被撤销,postgresql,amazon-redshift,Postgresql,Amazon Redshift,使用Redshift并且无法从myuser dev=# REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM myuser; REVOKE dev=# SELECT u.usename, s.schemaname, has_schema_privilege(u.usename,s.schemaname,'create') AS user_has_select_permission, has_schema_privilege
Redshift
并且无法从myuser
dev=# REVOKE ALL PRIVILEGES ON SCHEMA pg_catalog FROM myuser;
REVOKE
dev=# SELECT
u.usename,
s.schemaname,
has_schema_privilege(u.usename,s.schemaname,'create') AS user_has_select_permission,
has_schema_privilege(u.usename,s.schemaname,'usage') AS user_has_usage_permission
FROM
pg_user u
CROSS JOIN
(SELECT DISTINCT schemaname FROM pg_tables) s
WHERE
u.usename = 'myuser'
AND s.schemaname = 'pg_catalog'
;
usename | schemaname | user_has_select_permission | user_has_usage_permission
---------+------------+----------------------------+---------------------------
myuser | pg_catalog | f | t
(1 row)
这是为什么?这是因为这些特权被授予了
公共
即所有人
此外,SQL中的特权是累积的:您不能添加“负特权”,也就是说,创建例外。换句话说,您只能撤消以前授予的特权。此外,尝试撤销从未授予的特权既不是错误,也不会产生警告,但会被默默忽略
现在,由于目录表上的权限被授予了PUBLIC
,而不是myuser
,因此您的REVOKE
不起任何作用
我再次警告您:不要试图撤销目录表的特权 当你说“这些特权被授予
PUBLIC
”时,你的意思是PUBLIC
组?我这样问是因为当我从pg_组中选择*时,它返回0行右键;这是一个“伪群体”。例如,您不能删除它。“这是硬连接到系统中的。”femeloper问了一个新问题。