作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL(本章节)
Redis
Etcd
我们在部署PostgreSQL的时候,采用的是psql免密码直接连接数据库,在上个小节也介绍了PostgreSQL的增删改查(CRUD),但是真实应用我们都应该遵循最小权限原则,所以本小节就来介绍下他的用户及权限。
核心概念
在 PostgreSQL 中,用户和角色在概念上是统一的。从 8.1 版本开始,CREATE USER 只是 CREATE ROLE 的一个别名,唯一的区别是 CREATE USER 默认带有 LOGIN 权限,而 CREATE ROLE 默认没有。
LOGIN 权限的角色。PostgreSQL 的权限是分层的,理解这个层次至关重要:
实例级别 (Cluster Level) -> 数据库级别 (Database Level) -> 模式级别 (Schema Level) -> 对象级别 (Table/View/Function etc.)。其中模式是PostgreSQL特有的概念,其他概念和MySQL是一样的。
CREATE USER username WITH PASSWORD 'your_strong_password';
-- 或者等价的
CREATE ROLE username WITH LOGIN PASSWORD 'your_strong_password';CREATE ROLE group_name NOLOGIN;-- 修改密码
ALTER USER username WITH PASSWORD 'new_password';
-- 重命名
ALTER USER old_username RENAME TO new_username;
-- 给角色添加/删除属性
ALTER ROLE role_name WITH CREATEDB; -- 授予创建数据库权限
ALTER ROLE role_name WITH SUPERUSER; -- 授予超级用户权限(慎用!)
ALTER ROLE role_name WITH NOLOGIN; -- 禁止登录bash-4.2$ psql -U username -h127.0.0.1
Password for user username:
psql: error: connection to server at "127.0.0.1", port 5432 failed:
FATAL: database "username" does not existDROP ROLE role_name;
-- 或者
DROP USER username;注意:如果角色拥有数据库对象,则不能直接删除,需要先转移所有权或使用 DROP OWNED BY role_name; 和 REASSIGN OWNED BY role_name TO new_owner;。
连接到一个数据库(如 postgres)后,可以授予其他数据库的权限。
-- 允许角色连接到数据库
GRANT CONNECT ON DATABASE database_name TO role_name;
-- 允许角色在数据库中创建模式,模式没讲解,先忽略吧。
GRANT CREATE ON DATABASE database_name TO role_name;mydb=> \dt
List of relations
Schema | Name | Type | Owner
--------+-------+-------+----------
public | users | table | postgres
(1 row)
mydb=> select * from users;
ERROR: permission denied for table users
mydb=> 这是最常用的权限控制。
--允许访问 public 模式(前提)。
GRANT USAGE ON SCHEMA public TO users;
-- 授予 public 模式下所有现有表的 SELECT 权限。
GRANT SELECT ON ALL TABLES IN SCHEMA public TO users;
-- 授予 public 模式下所有现有表 增删改查的权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO user ;
-- 授予 public 模式下所有表的所有权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;
-- 假设 users 表在 public 模式(默认模式)
GRANT ALL PRIVILEGES ON TABLE public.users TO myuser;