暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

《课程笔记 | PostgreSQL深入浅出》之数据库用户权限管理(九)

原创 布衣 2022-11-05
1340

官方文档:

http://www.postgres.cn/docs/12/user-manag.html

PostgreSQL是通过角色来管理数据库权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户。角色可以拥有数据库对象,如表、索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些对象拥有哪些权限。

PostgreSQL:
最大限度的兼容Oralce
用户和角色的概念模糊的(界限基本消除)
不同:创建的用户默认具有登录权限,而角色没有

用户:

postgres=# create user user1 with encrypted password 'user1';
CREATE ROLE
postgres=# create role role1 with encrypted password 'role1';
CREATE ROLE
postgres=# \c postgres user1
Password for user user1: 
You are now connected to database "postgres" as user "user1".
postgres=> select current_user;
current_user 
--------------
user1
(1 row)

角色:

postgres=> \c postgres role1
Password for user role1: 
FATAL:  password authentication failed for user "role1"
Previous connection kept
postgres=> select current_user;
current_user 
--------------
user1	

image.png

  • 修改角色role1具有对数据库 postgres的登录权限
postgres=> alter user role1 with login;
ERROR:  permission denied
postgres=> \c postgres postgres
Password for user postgres: 
You are now connected to database "postgres" as user "postgres".
postgres=# alter user role1 with login;
ALTER ROLE
postgres=# \c postgres role1
Password for user role1: 
You are now connected to database "postgres" as user "role1".
postgres=> select current_user;
current_user 
--------------
role1

image.png

权限:

用户是否具有相关权限的视图
		pg_user,pg_role
postgres=> \x
扩展显示已打开.
postgres=> select * from pg_user where usename = 'user1';
-[ RECORD 1 ]+---------
usename      | user1
usesysid     | 16422
usecreatedb  | f
usesuper     | f
userepl      | f
usebypassrls | f
passwd       | ********
valuntil     |
useconfig    |
postgres=> select * from pg_roles where rolname = 'user1' or rolname = 'role1';
-[ RECORD 1 ]--+---------
rolname        | role1
rolsuper       | f
rolinherit     | t
rolcreaterole  | f
rolcreatedb    | f
rolcanlogin    | t
rolreplication | f
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | f
rolconfig      |
oid            | 16423
-[ RECORD 2 ]--+---------
rolname        | user1
rolsuper       | f
rolinherit     | t
rolcreaterole  | f
rolcreatedb    | f
rolcanlogin    | t
rolreplication | f
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | f
rolconfig      |
oid            | 16422	

事务,并发,锁的管理

事务是关系型数据库最重要的概念,而并发通常能带来更大的吞吐量、资源利用率和更好的性能。但是当多个事务并发执行时,即使每个单独的事务都正确执行,数据库的一致性也可能被破坏。为了控制并发事务之间的相互影响,解决并发可能带来的资源争用及数据不一致性问题,数据库的并发控制系统引入了基于锁的并发控制机制(Lock-BasedConcurrency Control)和基于多版本的并发控制机制MVCC(Multi-Version ConcurrencyControl)。

事务是数据库系统执行过程中最小的逻辑单位。当事务被提交时,数据库管理系统要确保一个事务中的所有操作都成功完成,并且在数据库中永久保存操作结果。如果一个事务中的一部分操作没有成功完成,则数据库管理系统会把数据库回滚到操作执行之前的状态。在PostgreSQL中,显式地指定BEGIN…END/COMMIT/ROLLBACK包括的语句块或一组语句为一个事务,未指定BEGIN…END/COMMIT/ROLLBACK的单条语句也称为一个事务。

  • 事务有四个重要的特性:原子性、一致性、隔离性、持久性。
  1. 原子性(Atomicity):一个事务的所有操作,要么全部执行,要么全部不执行。如果只执行事务中多个操作的前半部分就会出现错误,那么必须回滚所有操作,让数据在逻辑上回滚到最初改变前的状态。

  2. 一致性(Consistency):在事务完成或提交时,必须所有的数据都保持在一致的状态。

  3. 隔离性(Isolation):即使得每个事务都能确保一致性和原子性;要么是看到一个事物修改前的状态,要么看到的事一个事物修改后的状态。在这中间状态的数据是不可查看的。确保事务与事务并发执行时,每个事务都是独立存在,感觉不到有其他事务在并发地执行。
    持久性(Durability):一个事务完成之后,即使数据库发生故障,它对数据库的改变应该永久保存在数据库中;

事务egg:

环境检查:
[postgres@pgclass ~]$ psql -h 192.168.84.9 -p 5432
用户 postgres 的口令:
psql (12.12)
输入 "help" 来获取帮助信息.
postgres=# \c woo
您现在已经连接到数据库 "woo",用户 "postgres".
woo=# \d+ woo
 id   | integer |          |        |      | plain    |          |
 name | text    |          |        |      | extended |          |
 age  | integer |          |        |      | plain    |          |
woo=# select * from woo;
 id | name | age
----+------+-----
(0 行记录)

  • 事务使用方法实验一:
    关闭autocommit:
woo=# \set AUTOCOMMIT off
woo=# \echo :AUTOCOMMIT
off

  • 模拟事务:
woo=# insert into woo values(20,'wwl',25);
INSERT 0 1
woo=# insert into woo values(20,'wwl',26);
INSERT 0 1
woo=# select * from woo;
 id | name | age
----+------+-----
 20 | wwl  |  25
 20 | wwl  |  26
(2 行记录)

事务撤销:

woo=# rollback;
ROLLBACK
woo=# select * from woo;
 id | name | age
----+------+-----
(0 行记录)

事务使用方法实验二,通过begin来启动一个事物:
在一个事物中,只要事物没有结束,就不会提交,随时可以rollback.

[postgres@pgclass ~]$ psql -h 192.168.84.9 -p 5432
用户 postgres 的口令:
psql (12.12)
输入 "help" 来获取帮助信息.

postgres=# \c woo
您现在已经连接到数据库 "woo",用户 "postgres".
woo=# begin;
BEGIN
woo=# insert into woo values(1,'woo',25);
INSERT 0 1
woo=# insert into woo values(2,'woo',30);
INSERT 0 1
woo=# select * from woo;
 id | name | age
----+------+-----
  1 | woo  |  25
  2 | woo  |  30
(2 行记录)

woo=# rollback;
ROLLBACK
woo=# select * from woo;
 id | name | age
----+------+-----
(0 行记录)

image.png

  • 数据库中隔离级别有四种;分别是读未提交,读已提交,可重复读,可序列化:
    image.png

默认的隔离级别是读已提交;运行在这个级别的时候,select查询只能看到查询开始之前已提交的数据,而无法看到未提交的数据或在查询期间其他事物提交的数据。但是,select 查询能看见当前会话在前面事务中未提交的结果。实际上select 查询看到的事查询开始运行瞬间的一个快照.

如果选择的事读未提交,在PG里面实际上还是读已提交,在PG里面是不可能读到其它绘画未提交的数据。

如果选择可重复读,实际上任然是串行化,所以实际的隔离级别是更加的严格。

锁机制:

为了解决并发问题,数据库引入了“锁”的概念。基本的锁类型有两种:排它锁(Exclusive locks, X锁)和共享锁(Share locks, S锁)。
排它锁:被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象。
共享锁:被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加共享锁。

为了确保复杂的事务可以安全地同时运行,PostgreSQL提供了各种级别的锁来控制对各种数据对象的并发访问,使得对数据库关键部分的更改序列化。事务并发运行,直到它们尝试获取互相冲突的锁为止(比如两个事务更新同一行时)。当多个事务同时在数据库中运行时,并发控制是一种用于维持一致性和隔离性的技术,在PostgreSQL中,使用快照隔离Sanpshot Isolation (简称SI) 来实现多版本并发控制,同时以两阶段锁定 (2PL) 机制为辅。在执行DDL时使用2PL,在执行DML时使用SI。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论