暂无图片
已经回收了模式public的usage权限,但是仍能访问public下的表tt,这个哪里错了?
我来答
分享
暂无图片 匿名用户
已经回收了模式public的usage权限,但是仍能访问public下的表tt,这个哪里错了?

(postgres@[local]:5432)-[mydb]-#revoke USAGE ON SCHEMA public from readonly;
REVOKE
(postgres@[local]:5432)-[mydb]-#revoke select on all tables in schema public from readonly;
REVOKE
(postgres@[local]:5432)-[mydb]-#grant select on all tables in schema public to readonly;


(readonly@[local]:5432)-[mydb]->select * from tt limit 1;
id
----
1
(1 row)

(readonly@[local]:5432)-[mydb]->\d tt
Table "public.tt"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
id | integer |

那这个模式的usage权限,该如何理解?     

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
周波

  usage权限表示允许访问模式中包含的对象。如果没有此权限,仍可以看到对象名称,例如通过查询系统目录:

select relname,relkind from pg_class where relnamespace = (select oid from pg_namespace where nspname='public';

  如果你观察仔细,你会通过psql的\dn+命令发现,public模式下存在这样一条授权信息:’=UC/postgres’,这表示对于数据库中所有用户,默认在public模式上具有usage和create权限,当你执行第一条SQL收回用户readonly在public上的usage权限,看似执行成功,其实啥也没干,这条SQL试图去删掉public模式上这样的一条授权信息:“readonly=U/postgres”,但public模式上原来也不存在这样的授权信息。
  如果你想要撤回某个用户在public模式上的usage权限,应该使用如下语句(语句中的public表示一种特殊的“角色”,可以用来向系统中的每一个角色授予一个权限):

revoke usage on schema public from public;
暂无图片 评论
暂无图片 有用 1
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏