我第一次try 创建一个Postgres数据库.所以这可能是个愚蠢的问题.

我将基本只读权限分配给必须从PHP脚本访问数据库的DB角色,我有一个好奇心:如果我执行

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

还需要执行此操作吗?

GRANT USAGE ON SCHEMA schema TO role;

documentation人中:

用法:对于架构,允许访问包含在

我认为,如果我可以 Select 或操作模式中包含的任何数据,我就可以访问模式本身的任何对象.我说错了吗?如果不是,GRANT USAGE ON SCHEMA元是用来做什么的?文档中"假设对象自身的特权要求也得到了满足"的确切含义是什么?

推荐答案

不同对象上的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,仍然可以"看到"该表存在于模式中.不过,他们不能以任何方式与之交互,所以只是"列表"部分不太一样.)

Database相关问答推荐

如何在华为Appcube中创建和使用对象(模型)?

基于邮政编码的纬度和经度

SQL 历史(history)表设计

如何验证 SQLAlchemy ORM 中的列数据类型?

如何最好地在 MS SQL Server 中复制整个数据库?

Postgresql 从多个表中删除多行

ODBC 与 JDBC 与 ADO.NET

如何在 2 个 MySQL 数据库之间传输数据?

每个 Docker 容器一个或多个数据库

mySQL 复制是否具有即时数据一致性?

Android Room:如何建模关系?

在单个 postgres 查询中多次调用 `now()` 是否总是给出相同的结果?

您最喜欢在 django 中管理数据库迁移的解决方案是什么?

什么是非关系数据库的例子?

Android 上的测试数据库:ProviderTestCase2 还是 RenamingDelegatingContext?

如何使用 Entity Framework CF 在父级之前删除子实体?

使用默认路径中的文件创建数据库

Sqlite 和 Python - 使用 fetchone() 返回字典?

数据库与微服务的一致性

以编程方式嵌入 Java h2 数据库