1.逻辑结构

最上层是实例,实例中允许创建多个数据库,每个数据库中可以创建多个schema,每个schema下面可以创建多个对象。
对象包括表、物化视图、操作符、索引、视图、序列、函数、… 等等。

PostgreSQL用户权限深入理解_数据库


在数据库中所有的权限都和角色(用户)挂钩,public是一个特殊角色,代表所有人。

超级用户是有允许任意操作对象的,普通用户只能操作自己创建的对象。

另外有一些对象是有赋予给public角色默认权限的,所以建好之后,所以人都有这些默认权限。

2.权限体系

PostgreSQL用户权限深入理解_数据库_02

实例级别的权限由pg_hba.conf来控制,例如 :

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all postgres 0.0.0.0/0 reject
host all all 0.0.0.0/0 md5

以上配置的解释
允许任何本地用户无密码连接任何数据库
不允许postgres用户从任何外部地址连接任何数据库
允许其他任何用户从外部地址通过密码连接任何数据库

数据库级别的权限,包括允许连接数据库,允许在数据库中创建schema。
默认情况下,数据库在创建后,允许public角色连接,即允许任何人连接。
默认情况下,数据库在创建后,不允许除了超级用户和owner之外的任何人在数据库中创建schema。
默认情况下,数据库在创建后,会自动创建名为public 的schema,这个schema的all权限已经赋予给public角色,即允许任何人在里面创建对象。

schema级别的权限,包括允许查看schema中的对象,允许在schema中创建对象。
默认情况下新建的schema的权限不会赋予给public角色,因此除了超级用户和owner,任何人都没有权限查看schema中的对象或者在schema中新建对象。

3.实验

创建用户与授权

CREATE USER user_0001 WITH PASSWORD '123456';

create database db_0001 owner user_0001 ;

# 直接授权指定用户
GRANT ALL PRIVILEGES ON DATABASE db3 TO user_0001 ;

将数据库 db_0001 权限授权于 user_0001
但此时用户还是没有读写权限,需要继续授权表
此时user_0001 用户可以登录,能看到别的数据库和表,但是不能操作。

将当前数据库下 public schema 的表都授权于 user_0001

## 注意,该sql语句必须在所要操作的数据库里执行
GRANT ALL PRIVILEGES ON all tables in schema public TO user_0001 ;

## 单个表
GRANT SELECT ON TABLE mytable TO user_0001 ;

查看数据库用户的权限

SELECT
d.oid,
d.datname AS databasename,
d.datacl,
pg_get_userbyid ( d.datdba ) AS databaseowner,
d.datistemplate,
d.datallowconn,
d.datcollate,
d.datctype,
shobj_description ( d.oid, 'pg_database' ) AS description,
d.datconnlimit,
T.spcname,
d.ENCODING,
pg_encoding_to_char ( d.ENCODING ) AS encodingname
FROM
pg_database d
LEFT JOIN pg_tablespace T ON d.dattablespace = T.oid

PostgreSQL用户权限深入理解_数据库_03