Postgresql 数据库权限说明
无    2021-03-26 18:00:58    31    0    0
sanger

1. PG权限位说明

使用psql的\dp 命令获取表和字段的现存权限的有关的信息。例如:

  1. => \dp mytable
  2. Access privileges
  3. Schema | Name | Type | Access privileges | Column access privileges
  4. --------+---------+-------+-----------------------+--------------------------
  5. public | mytable | table | miriam=arwdDxt/miriam | col1:
  6. : =r/miriam : miriam_rw=rw/miriam
  7. : admin=arw/miriam
  8. (1 row)

\dp显示的条目解释如下:

  1. rolename=xxxx -- 赋予一个角色的权限
  2. =xxxx -- 赋予 PUBLIC 的权限
  3. r -- SELECT ("读")
  4. w -- UPDATE ("写")
  5. a -- INSERT ("追加")
  6. d -- DELETE
  7. D -- TRUNCATE
  8. x -- REFERENCES
  9. t -- TRIGGER
  10. X -- EXECUTE
  11. U -- USAGE
  12. C -- CREATE
  13. c -- CONNECT
  14. T -- TEMPORARY
  15. arwdDxt -- ALL PRIVILEGES (用于表,用于其他对象时不同)
  16. * -- 给前面权限的授权选项
  17. /yyyy -- 授出这个权限的角色

2. PG权限详解

  • SELECT
    允许从指定表、视图或序列的任何列或者列出的特定列进行SELECT。还允许使用COPY TO。在UPDATE或DELETE中引用已有列值时也需要这个特权。对于序列,这个特权也允许使用currval函数。对于大对象,这个特权允许读取对象。

  • INSERT
    允许INSERT一个新行到指定表中。如果列出了特定的列,只有这些列能在INSERT命令中被赋值(其他列将因此收到默认值)。还允许COPY FROM。

  • UPDATE
    允许对指定表、视图或序列的任何列或者列出的特定列进行UPDATE(实际上,任何非平凡的UPDATE命令也会要求SELECT特权,因为它必须引用表列来判断哪些行要被更新或者为列计算新值)。除SELECT特权之外,SELECT … FOR UPDATE以及SELECT … FOR SHARE也要求至少一列上的这个特权。对于序列,这个特权允许使用nextval和setval函数。对于大对象,这个特权允许写入或者截断对象。

  • DELETE
    允许从指定的表中DELETE一行(实际上,任何非平凡的DELETE命令也将要求SELECT特权,因为它必须引用表列来判断要删除哪些行)。

  • TRUNCATE
    允许在指定的表上TRUNCATE。

  • REFERENCES
    允许创建引用指定表或指定表列的外键约束。(请参阅CREATE TABLE语句。)

  • TRIGGER
    允许在指定的表上创建触发器(见CREATE TRIGGER语句)。

  • CREATE
    对于数据库,允许在其中创建新模式或发布。
    对于模式,允许在其中创建新的对象。要重命名一个已有对象,你必须拥有该对象并且具有所在模式的这个特权。
    对于表空间,允许在其中创建表、索引和临时文件,并且允许创建使用该表空间作为默认表空间的数据库(注意撤回这个特权将不会更改现有对象的放置位置)。

  • CONNECT
    允许用户连接到指定数据库。在连接开始时会检查这个特权(除了检查由pg_hba.conf施加的任何限制之外)。

  • TEMPORARY
    TEMP
    允许在使用指定数据库时创建临时表。

  • EXECUTE
    允许使用指定的函数以及使用在该函数之上实现的任何操作符。这是适用于函数的唯一一种特权类型(这种语法也可用于聚集函数)。

  • USAGE
    对于过程语言,允许使用指定的语言创建函数。这是适用于过程语言的唯一一种特权类型。
    对于模式,允许访问包含在指定模式中的对象(假定这些对象的拥有特权要求也满足)。本质上这允许被授权者在模式中“查阅”对象。如果没有这个权限,还是有可能看到对象名称,例如通过查询系统表。还有,在撤回这个权限之后,现有后端可能有语句之前已经执行过这种查阅,因此这不是一种阻止对象访问的完全安全的方法。
    对于序列,这种特权允许使用currval和nextval函数。
    对于类型和域,这种特权允许用该类型或域来创建表、函数和其他模式对象(注意这不能控制类型的一般“用法”,例如出现在查询中的该类型的值。它只阻止基于该类型创建对象。该特权的主要目的是控制哪些用户在一个类型上创建了依赖,这能够阻止拥有者以后更改该类型)。
    对于外部数据包装器,这个特权允许使用该外部数据包装器创建新服务器。
    对于服务器,这个特权允许使用该服务器创建外部表, 被授权者还可以创建、修改或删除与该服务器相关的他们自己的用户映射。

  • ALL PRIVILEGES
    一次授予所有的可用特权。在PostgreSQL中,PRIVILEGES关键词是可选的,但是在严格的 SQL 中是要求它的。

其他命令所要求的特权会被列在相应命令的参考页中。

3. 需要注意的其他问题

3.1 关于库和表的删除权限

删除库需要是这个库的owner,删除表需要是表的创建者。

3.2 已赋权给库下所有表的权限给账号B,但在A账号新建表后,B账号无此表权限。

语句只是对当时状态下的所有表进行赋权,如果后续不是用的B账号新建的表,还是会出现权限不足问题(需要重新赋权一次)。

4. 参考

http://www.postgres.cn/docs/10/sql-grant.html

上一篇: 阿里云 RDS Mysql 数据库权限说明

下一篇: CoreOS概述

31 人读过
文档导航