pg使用角色的概念管理数据库访问权限,角色是一系列相关权限的集合。为了管理方便,通常把一系列先关的权限赋予给一个角色,如果哪个用户需要这些权限,就把这些角色赋予给响应的用户。 由于用户也拥有一系列的相关权限,为了简化管理,在PG中,角色与用户是没有区别的,一个用户也是一个角色,我们可以把一个用户的权限赋值给另一个用户。

用户和角色在整个数据库实例中是全局的,在同一个实例的不同数据库中,看到的用户都是相同的。

数据库初始化时会创建一个与操作系统同名的超级用户postgres,也可以使用-U:指定超级用户

(一)创建用户和角色

创建用户和角色的语法如下:

-- 创建用户
CREATE USER name [[ WITH ] option [...]] -- 创建角色
CREATE ROLE name [[ WITH ] option [...]]

备注:在PG中,用户与角色是没有区别的,角色默认没有login权限,无法登陆,如果授予login之后,也可以像用户一样登陆。

option常用选项如下:

  • SUPERUSER | NOSUPERUSER:创建出来的用户是否为超级用户
  • CREATEDB | NOCREATEDB:创建出来的用户是否有create database的权限
  • CREATEROLE | NOCREATEROLE:创建出来的用户是否有创建其它角色的权限
  • CREATEUSER | NOCREATEUSER:创建出来的用户是否有创建其它用户的权限
  • INHERIT | NOINHERIT:确定角色是否继承其它角色的权限
  • LOGIN | NOLOGIN:创建出来的角色是否有登录权限
  • CONNECTION LIMIT n:创建出来的角色并发连接数限制数量,默认值是“-1”,表示没有限制
  • VALID UNTIL 'timestamp':密码失效时间

(二)权限的管理

在postgresql数据库中,任何逻辑对象(包括数据库)都是有所有者的,也就是说数据库对象都是属于某个用户的,所以,无需把对象的权限赋予所有者,因为所有者默认就拥有所有的权限,在PG数据库中,删除及其修改对象的权限都不能赋予别的用户,它是所有者的固有权限,不能赋予或撤销,所有者也隐式地拥有把操作该对象的权限授予其他用户的权利。

(2.1)两类权限

用户的权限分两类,一类是在创建用户时就指定的权限,有:

  • 超级用户的权限
  • 创建数据库的权限
  • 是否允许login的权限
  • 更多见\help create role

这些权限是创建用户时指定的,后面可以使用alter role来修改。

另一类是有GRANT和REVOKE命令来管理的,有:

  • 在数据库中创建schema的权限

  • 在指定的数据库中创建临时表的权限

  • 连接某个数据库的权限

  • 在某个数据库中创建数据库对象的权限,如表、视图、函数等

  • 在一些表中做SELECT 、INSERT、UPDATE、DELETE等操作的权限

  • 在一张表的列上做 SELECT 、UPDATE、DELETE等操作的权限

  • 对序列进行查询(执行序列的currval函数)、使用(执行序列的currval和nextval函数)、更新的权限

  • 在表上创建触发器的权限

  • 把表、索引创建到指定表空间的权限

(2.2)GRANT 和REVOKE权限

(2.2.1)角色的授予与回收

-- 将角色授予给另外一个角色
GRANT role_name[,...] TO role_name[,...] WITH ADMIN OPTION; -- 角色回收
REVOKE role_name[,...] FROM role_name[,...][CASCADE | RESTRICT]

(2.2.2)权限的授予与回收

权限的授予

db1=# \help grant
命令: GRANT
描述: 定义存取权限
语法:
-- 表相关权限
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] 表名 [, ...]
| ALL TABLES IN SCHEMA 模式名称 [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 列相关权限
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( 列名称 [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( 列名称 [, ...] ) }
ON [ TABLE ] 表名 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 序列相关权限
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE 序列名称 [, ...]
| ALL SEQUENCES IN SCHEMA 模式名称 [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 数据库相关权限
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE 数据库名称 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN 域_名称 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER 外部数据封装器的名称 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER 服务器名称 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 函数、存储过程相关权限
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { { FUNCTION | PROCEDURE | ROUTINE } 程序名称 [ ( [ [ 参数模式 ] [ 参数名称 ] 参数类型 [, ...
] ] ) ] [, ...]
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA 模式名称 [, ...] }

(2.2.3)权限授予回收总结

postgresql中的权限是按照以下几个层次进行管理的:

1.首先管理赋予用户的特殊权限,如超级用户的权限,创建数据库的权限、创建用户的权限、login权限等

2.然后是在数据库中创建schema的权限

3.接着是在schema中创建数据库对象(如表、索引)的权限

4.之后是对表进行操作(insert、update、delete、select)的权限

5.最后是操作(update、delete、select)表中某些字段的权限

(2.3)权限操作常用命令

(2.3.1)授予增删查改权限

GRANT update,delete,insert,select ON ALL TABLES IN SCHEMA public TO signalmap_rw;

(2.3.2)回收public权限

在初始化数据库实例后,数据库中默认就会存在一个名称为“public”的schema,任何用户都有在public schema上的create 权限,通常我们需要把这个权限回收回来

revoke create on schema public from public;

(2.3.3)创建只读用户

-- 回收public模式的create权限
revoke create on schema public from public;
-- 创建只读用户,密码为readonly
create user readonly password 'readonly';
-- 授权public模式给readonly
grant usage on schema public to readonly;
-- 授权public模式的所有表权限给readonly用户
grant select on all tables in schema public to readonly;
-- 切换到readonly测试
\c - readonly
-- 切换到postgres用户
\c - postgres
-- 将public模式的默认表查询权限授予readonly用户
alter default privileges in schema public grant select on tables to readonly;

(2.3.4)查看用户权限

-- 查看某用户的系统权限
SELECT * FROM pg_roles WHERE rolname='postgres'; -- 查看某用户的表级别权限
select * from information_schema.table_privileges where grantee='postgres'; -- 查看某用户的usage权限
select * from information_schema.usage_privileges where grantee='postgres'; -- 查看某用户在存储过程函数的执行权限
select * from information_schema.routine_privileges where grantee='postgres'; -- 查看某用户在某表的列上的权限
select * from information_schema.column_privileges where grantee='postgres'; -- 查看当前用户能够访问的数据类型
select * from information_schema.data_type_privileges ; -- 查看用户自定义类型上授予的USAGE权限
select * from information_schema.udt_privileges where grantee='postgres';

postgresql用户与权限管理的更多相关文章

  1. PostgreSQL 用户和权限管理

    PostgreSQL 用户和权限管理 创建 CREATE ROLE rolename;CREATE USER username;CREATE USER和CREATE ROLE的区别在于,CREATE ...

  2. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  3. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10

    今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求 ...

  4. MySQL用户与权限管理

    执行mysql select 查询报错: SELECT command denied to user 'root'@'localhost' for table "xxx" 问题原因 ...

  5. mysql用户和权限管理

    用户和权限管理 Information about account privileges is stored in the user, db, host, tables_priv, columns_p ...

  6. 【linux相识相知】用户及权限管理

    linux系统是多用户(Multi-users)和多任务(Multi-tasks)的,这样的目的是为了一台linux主机可以给很多用户提供服务同时运行多种服务,但是我们是怎么区分每个用户呢?作为一个管 ...

  7. linux用户及权限管理

    [文件管理.管道.用户及组管理.用户及权限管理]\用户及组管理 用户与组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这 ...

  8. Mysql 用户,权限管理的几点理解。

    前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql. 公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂..简单是因为网上关于m ...

  9. DQL用户、权限管理(mysql8.0)

    DQL用户.权限管理(mysql8.0) 查看所有的用户: use mysql; -- 使用mysql数据库 select * from user; -- 查询user表中的全部信息,也就是用户 创建 ...

随机推荐

  1. 在sqlbolt上学习SQL

    在sqlbolt上学习SQL 该网站能够学习sql基础,并且能在网页中直接输入sql语句进行查询. 学习网站原网址https://sqlbolt.com/(!部分指令该网站不支持,且存在一些bug!) ...

  2. 讲一个linux服务启动报错问题排查

    例子 首先我们在/usr/lib/systemd/system目录下创建一个服务文件,写下服务启动任务配置.下面我以prometheus的node_exporter为例 vim /usr/lib/sy ...

  3. 6G显卡显存不足出现CUDA Error:out of memory解决办法

    ​ 从6月初开始,6G显存的显卡开始出现CUDA Error:out of memory的问题,这是因为dag文件一直在增加,不过要增加到6G还需要最少两年的时间. 现在出现问题的原因是1.内核太古老 ...

  4. OpenLayers入门(一)

    OpenLayers简介 OpenLayers(https://openlayers.org/)是一个用来帮助开发Web地图应用的高性能的.功能丰富的JavaScript类库,可以满足几乎所有的地图开 ...

  5. Vue的基础语法

    前言 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是, Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手, ...

  6. 面试突击61:说一下MySQL事务隔离级别?

    MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种: READ UNCOMMITTED:读未提交. READ COMMITTED:读已提交. REP ...

  7. 零基础学Java(3)运算符

    运算符 运算符用于连接值.Java提供了一组丰富的算术和逻辑运算符以及数学函数. 算术运算符 在Java中,使用算术运算符+.-.*./表示加.减.乘.除运算.当参与/运算的两个操作数都是整数时,表示 ...

  8. 10道不得不会的JavaEE面试题

    10道不得不会的 JavaEE 面试题 我是 JavaPub,专注于面试.副业,技术人的成长记录. 以下是 JavaEE 面试题,相信大家都会有种及眼熟又陌生的感觉.看过可能在短暂的面试后又马上忘记了 ...

  9. Modeling Conversation Structure and Temporal Dynamics for Jointly Predicting Rumor Stance and Veracity(ACL-19)

    记录一下,论文建模对话结构和时序动态来联合预测谣言立场和真实性及其代码复现. 1 引言 之前的研究发现,公众对谣言消息的立场是识别流行的谣言的关键信号,这也能表明它们的真实性.因此,对谣言的立场分类被 ...

  10. PostgreSQL的查询技巧: 零除, GENERATED STORED, COUNT DISTINCT, JOIN和数组LIKE

    零除的处理 用NULLIF(col, 0)可以避免复杂的WHEN...CASE判断, 例如 ROUND(COUNT(view_50.amount_in)::NUMERIC / NULLIF(COUNT ...