不同对象上的GRANT
是分开的.在数据库上设置GRANT
并不意味着对其中的架构拥有GRANT
个权限.类似地,对架构进行加密不会授予对中的表的权限.
如果您拥有从表中访问SELECT
的权限,但没有在包含它的模式中查看它的权限,那么您就不能访问该表.
权限测试按如下顺序进行:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
您的念力可能源于这样一个事实,即public
模式对角色public
具有默认的GRANT
所有权限,每个用户/组都是该角色的成员.所以每个人都已经在该架构上使用了.
这句话:
(假设对象自身的权限要求也得到满足)
就是说,在一个模式中必须有USAGE
个才能使用其中的对象,但是在一个模式中有USAGE
个本身并不足以使用模式中的对象,还必须对对象本身拥有权限.
它就像一棵目录树.如果您创建了一个目录somedir
,其中包含文件somefile
,然后将其设置为只有您自己的用户可以访问该目录或文件(目录上的模式rwx------
,文件上的模式rw-------
),那么其他人无法列出该目录以查看该文件是否存在.
如果您授予文件的完全读权限(模式rw-r--r--
),但不更改目录权限,这不会有什么不同.没有人可以使用see来读取该文件,因为他们没有列出该目录的权限.
如果您改为对目录设置rwx-r-xr-x
,将其设置为使用户可以列出和遍历目录,但不更改文件权限,则用户可以list该文件,但不能read该文件,因为他们没有访问该文件的权限.
您需要为用户设置both个权限才能实际查看该文件.
在Pg中也是一样.您需要schema USAGE
权限和对象权限来对对象执行操作,比如表中的SELECT
.
(类比略有降低,因为PostgreSQL还没有行级安全性,所以用户通过直接从pg_class
开始SELECT
,仍然可以"看到"该表存在于模式中.不过,他们不能以任何方式与之交互,所以只是"列表"部分不太一样.)