1. 角色
决定发起连接的命令的初始访问权限。在PG中,角色和用户相当于是一样的对象。区别在于创建角色时是否又Login权限。
1.1 创建角色
CREATE ROLE name;
postgres->postgres@[local]:5432=# h create role
Command: CREATE ROLE
Description: define a new database role
Syntax:
CREATE ROLE name [ [ WITH ] option [ ... ] ]
where option can be:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| BYPASSRLS | NOBYPASSRLS
| CONNECTION LIMIT connlimit
| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
| VALID UNTIL 'timestamp'
| IN ROLE role_name [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid
-- 2.1 查询角色,检查pg_roles系统目录
SELECT rolname FROM pg_roles;
-- 2.2 psql程序的du
1.2 角色属性
定义角色的权限并且与客户端认证系统交互
权限 | 说明 | 示例 |
---|---|---|
login privilege | 只有具有LOGIN 属性的角色才能被用于一个数据库连接的初始角色名称。一个带有LOGIN 属性的角色可以被认为和一个“数据库用户”相同。CREATE USER 和CREATE ROLE 等效,他们的区别:CREATE USER具有LOGIN 权限,而CREATE ROLE没有LOGIN 权限 |
CREATE ROLE name LOGIN; CREATE USER name; |
superuser status | 一个数据库超级用户会绕开所有权限检查,除了登入的权利。 | --创建超级用户 CREATE ROLE name SUPERUSER |
database creation | 创建数据库权限 | CREATE ROLE name CREATEDB |
role creation | 创建角色权限。带有CREATEROLE 权限的角色可以修改和删除其他角色,还可以授予或回收角色中的成员关系 |
CREATE ROLE name CREATEROLE |
initiating replication | 流复制角色。一个被用于流复制的角色必须也具有LOGIN 权限。 |
CREATE ROLE name REPLICATION LOGIN |
password | 只有当客户端认证方法要求用户在连接数据库时提供一个口令时,一个口令才有意义。password 和md5 认证方法使用口令。 |
--创建角色时指定一个口令: CREATE ROLE name PASSWORD 'string'。 |
1.3 角色成员关系
把用户分组在一起来便于管理权限常常很方便:那样,权限可以被授予一整个组或从一整个组回收。在PostgreSQL中通过创建一个表示组的角色来实现,并且然后将在该组角色中的成员关系授予给单独的用户角色。
使用GRANT和REVOKE命令增加和移除成员
GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;
组角色的成员可以以两种方式使用角色的权限。
- 一个组的每一个成员可以显式地执行SET ROLE命令来临时“成为”组角色。在这种状态中,数据库会话可以访问组角色而不是原始登录角色的权限,并且任何被创建的数据库对象被认为属于组角色而不是登录角色。
- 有INHERIT属性的成员角色自动地具有它们所属角色的权限,包括任何组角色继承得到的权限
-- 创建组角色 joe
CREATE ROLE joe LOGIN INHERIT;
-- 创建组角色 admin
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
-- 为角色joe授予组角色admin权限
GRANT admin TO joe;
-- 为角色admin授予组角色wheel权限
GRANT wheel TO admin;
对于角色joe来说,它具有登录权限及授予给admin组角色权限。然而,授予给wheel
的权限不可用,因为即使joe
是wheel
的一个间接成员(admin),但是该成员关系是通过带NOINHERIT
属性的admin
得到。
角色属性LOGIN
、SUPERUSER
、CREATEDB
和CREATEROLE
是一种特殊权限,但是它们从来不会像数据库对象上的普通权限那样被继承。要使用这些属性,必须显性执行SET ROLE
到一个具有该属性的角色。
销毁一个组角色:DROP ROLE name;
任何在该组角色中的成员关系会被自动撤销。
1.4 删除角色
由于角色可以拥有数据库对象并且能持有访问其他对象的特权。要删除角色必须先将该用户拥有的对象删除或转移给其他拥有者,并将已授予该角色的权限已经被回收。
-- 转移对象拥有者
ALTER TABLE bobs_table OWNER TO alice;
移除曾经拥有过对象的角色的方法
REASSIGN OWNED BY doomed_role TO successor_role;
DROP OWNED BY doomed_role;
-- 在集簇中的每一个数据库中重复上述命令
DROP ROLE doomed_role;
1.5 默认角色
PostgreSQL提供了一组默认角色,它们提供对特定的、通常需要的、需要特权的功能和信息的访问。
角色 | 允许的访问 |
---|---|
pg_read_all_settings | 读取所有配置变量,甚至是那些通常只对超级用户可见的变量。 |
pg_read_all_stats | 读取所有的pg_stat_*视图并且使用与扩展相关的各种统计信息,甚至是那些通常只对超级用户可见的信息。 |
pg_stat_scan_tables | 执行可能会在表上取得ACCESS SHARE 锁的监控函数(可能会持锁很长时间)。 |
pg_signal_backend | 向其他后端发送信号(例如:取消查询、中止)。 |
pg_read_server_files | 允许使用COPY以及其他文件访问函数从服务器上该数据库可访问的任意位置读取文件。 |
pg_write_server_files | 允许使用COPY以及其他文件访问函数在服务器上该数据库可访问的任意位置中写入文件。 |
pg_execute_server_program | 允许用运行该数据库的用户执行数据库服务器上的程序来配合COPY和其他允许执行服务器端程序的函数。 |
pg_monitor | 读取/执行各种监控视图和函数。这个角色是pg_read_all_settings 、pg_read_all_stats 以及pg_stat_scan_tables 的成员。 |
pg_read_server_files
、pg_write_server_files
以及pg_execute_server_program
角色的目的是允许管理员有一些可信但不是超级用户的角色来访问文件以及以运行数据库的用户在数据库服务器上运行程序。由于这些角色能够防伪服务器文件系统上的任何文件,因此在直接访问文件时它们会绕过任何数据库级别的权限检查并且它们可以被用来得到超级用户级别的访问,因此在把这些角色授予给用户时应当非常小心。
pg_monitor
、pg_read_all_settings
、pg_read_all_stats
和pg_stat_scan_tables
角色的目的是允许管理员能为监控数据库服务器的目的很容易地配置角色。它们授予一组常用的特权,这些特权允许角色读取各种有用的配置设置、统计信息以及通常仅限于超级用户的其他系统信息。
管理员可以用GRANT命令把对这些角色的访问授予给用户GRANT pg_signal_backend TO admin_user;
1.6 管理用户密码
-- 登录(psql)
psql -U admin postgres
-- alter命令修改用户密码:
alter user user_name with password 'new password';
-- # 注意密码是单引号`'`包围的内容,最后的`;`号
-- 修改密码过期时间:
alter user user_name with valid until '2021-01-01 08:00:00';
du+ user_name
-- 改为永不过期:
alter user user_name with valid until 'infinity';
-- 检查确认
select * from pg_user;
select * from pg_shadow;
2. 数据库
2.1 概述
一个数据库是一些SQL对象(“数据库对象”)的命名集合。通常每个数据库对象(表、函数等) 属于并且只属于一个数据库(不过有几个系统表如pg_database
属于整个集簇并且对集簇中的每个数据库都是可访问的)。更准确地说,一个数据库是一个模式的集合, 而模式包含表、函数等等。因此完整的层次是这样的:服务器、数据库、模式、表(或者某些其他对象类型,如函数)。
模式只是一个纯粹的逻辑结构并且谁能访问某个模式由权限系统管理。
-- 现有数据库的集合,可以检查系统目录pg_database
SELECT datname FROM pg_database;
-- psql程序的l元命令和-l命令行选项也可以用来列出已有的数据库。
2.2 创建数据库
initdb
命令在初始化数据存储区域时,默认创建postgres,template1数据库
-- 1.1 为当前角色创建数据库(psql)
CREATE DATABASE name;
-- 1.2 为当前角色创建数据库(shell)
createdb dbname
-- 2.1 为指定拥有者创建数据库(psql)
CREATE DATABASE dbname OWNER rolename;
-- 2.2 为指定拥有者创建数据库(shell)
createdb -O rolename dbname
2.3 模板数据库(template1/template0)
CREATE DATABASE
实际上通过拷贝一个已有数据库进行工作。默认情况下,它拷贝名为template1
的标准系统数据库。所以该数据库是创建新数据库的“模板”。 如果你为template1
数据库增加对象,这些对象将被拷贝到后续创建的用户数据库中。
系统里还有名为template0
的第二个标准系统数据库。这个数据库包含和template1
初始内容一样的数据,也就是说,只包含你的PostgreSQL版本预定义的标准对象。
模板库区别:
- 在复制
template0
时指定新的编码和区域设置 template1
的副本必须使用和它相同的设置
-- 通过拷贝template0来创建一个数据库(psql)
CREATE DATABASE dbname TEMPLATE template0;
-- 通过拷贝template0来创建一个数据库(shell)
createdb -T template0 dbname
对于每一个数据库在pg_database
中存在两个有用的标志: datistemplate
和datallowconn
列。
-
datistemplate
可以被设置来指示该数据库是不是要作为CREATE DATABASE
的模板。如果设置了这个标志,那么该数据库可以被任何有CREATEDB
权限的用户克隆;如果没有被设置,那么只有超级用户和该数据库的拥有者可以克隆它。 -
如果
datallowconn
为假,那么将不允许与该数据库建立任何新的连接(但已有的会话不会因为把该标志设置为假而被中止)。template0
通常被标记为datallowconn = false
来阻止对它的修改。 -
template0
和template1
通常总是被标记为datistemplate = true
。
2.4 删除数据库
只有数据库的拥有者或者超级用户才可以删除数据库。删除数据库会移除其中包括的所有对象。数据库的删除不能被撤销。
-- 删除数据库
-- psql
DROP DATABASE name;
-- shell
dropdb dbname
2.5 表空间
PostgreSQL中的表空间允许数据库管理员在文件系统中定义用来存放表示数据库对象的文件的位置。一旦被创建,表空间就可以在创建数据库对象时通过名称引用。
表空间也是数据库集簇的一部分 并且不能被视作数据文件的一个自治集合。 它们依赖于包含在主数据目录中的元数据,并且因此不能被附加到一个不同的数据库集簇或者单独备份。
当初始化数据库集簇($PGDATA
)时,会自动创建两个表空间。pg_global
表空间被用于共享系统目录。pg_default
表空间是template1
和template0
数据库的默认表空间。$PGDATA/pg_tblspc
目录包含指向集簇中定义的每个非内建表空间的符号连接。
2.5.1 创建表空间
-- 格式
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';
位置必须是一个已有的空目录,并且属于PostgreSQL操作系统用户
# 1. FS上创建目录
mkdir -p /ups/data/pgdata/devtbs
chown postgres:postgres /ups/data/pgdata/devtbs
chmod 700 /ups/data/pgdata/devtbs
# 2. psql上创建表空间
create tablespace "devtbs" location '/ups/data/pgdata/devtbs';
# 3. create dbs
create database "devdb" with owner = postgres encoding = 'UTF8' tablespace = devtbs;
# 4. show info
select oid,datname from pg_database;
2.5.2 创建数据库对象到指定表空间
-- 1.1
CREATE TABLE foo(i int) TABLESPACE space1;
-- 1.2 指定默认表空间
SET default_tablespace = space1;
CREATE TABLE foo(i int);
2.5.3 临时表空间
temp_tablespaces参数决定临时表和索引的位置,以及用于大数据集排序等目的的临时文件的位置。 这可以是一个表空间名的列表,而不是只有一个。因此,与临时对象有关的负载可以散布在多个表空间上。每次要创建一个临时对象时,将从列表中随机取一个成员来存放它。
2.5.4 删除表空间
-- pg_tablespace视图查看表空间的集合或是使用db元命令查看
SELECT spcname FROM pg_tablespace;