GRANT
不同对象上的 s 是分开的。GRANT
对数据库进行操作对其中的架构没有GRANT
权限。类似地,GRANT
对模式进行 ing 不会授予对其中表的权限。
如果您有权访问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
架构默认GRANT
具有角色的所有权限public
,每个用户/组都是该角色的成员。因此,每个人都已经在该架构上使用过。
词组:
(假设也满足对象自身的权限要求)
是说您必须拥有USAGE
架构才能使用其中的对象,但是拥有USAGE
架构本身并不足以使用架构中的对象,您还必须拥有对象本身的权限。
它就像一个目录树。如果您创建一个somedir
包含文件的目录,somefile
然后将其设置为只有您自己的用户可以访问该目录或文件(rwx------
目录上的模式rw-------
,文件上的模式),那么没有其他人可以列出该目录以查看该文件是否存在。
如果您要授予对文件 (mode rw-r--r--
) 的全局读取权限,但不更改目录权限,则没有任何区别。没有人可以看到该文件以阅读它,因为他们没有列出目录的权限。
如果您改为设置rwx-r-xr-x
目录,将其设置为人们可以列出和遍历目录但不更改文件权限,人们可以列出文件但无法读取它,因为他们无权访问该文件。
您需要为人们设置这两种权限才能实际查看文件。
Pg中的相同内容。您需要架构USAGE
权限和对象权限才能对对象执行操作,例如SELECT
从表中执行操作。
(这个类比有点落空,因为 PostgreSQL 还没有行级安全性,所以用户仍然可以通过SELECT
ing frompg_class
直接“看到”表存在于模式中。他们不能以任何方式与之交互, 但是,所以它只是“列表”部分并不完全相同。)