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问了一个新问题。