目录表的特权不会被撤销
Posted
技术标签:
【中文标题】目录表的特权不会被撤销【英文标题】:Privileges on catalog tables are not revoked 【发布时间】:2021-02-24 17:00:14 【问题描述】:使用 Redshift
并且无法从 myuser
撤销对 pg_catalog
架构的所有权限
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)
这是为什么呢?
【问题讨论】:
【参考方案1】:那是因为这些特权被授予PUBLIC
即所有人。
另外,SQL 中的权限是累积的:不能添加“负权限”,也就是例外。换句话说,您只能撤销以前授予的特权。此外,尝试REVOKE
从未授予的特权既不是错误也不会产生警告,但会被忽略。
现在,由于目录表的权限被授予PUBLIC
,而不是myuser
,因此您的REVOKE
什么都不做。
我再次警告你:不要试图撤销目录表的权限!
【讨论】:
当您说“这些权限被授予PUBLIC
”时,您的意思是PUBLIC
组?我问是因为当我做 SELECT * from pg_groups
它返回 0 行
对;它是一个“伪群”。例如,您不能丢弃它。它是硬连线到系统中的。
@femeloper 问一个新问题。以上是关于目录表的特权不会被撤销的主要内容,如果未能解决你的问题,请参考以下文章