PostgreSQL 数据库角色
数据库角色
PostgreSQL使用角色的概念管理数据库访问权限。一个角色可以被看成是一个数据库用户或者是一个数据库用户组,这取决于角色被怎样设置。
角色可以拥有数据库对象(例如,表和函数)并且能够把那些对象上的权限赋予给其他角色来控制谁能访问哪些对象。
此外,还可以把一个角色中的成员资格授予给另一个角色,这样允许成员角色使用被赋予给另一个角色的权限。
1. 数据库角色
数据库角色在概念上已经完全与操作系统用户独立开来。
要创建一个角色,可使用CREATE ROLE SQL 命令:
CREATE ROLE name;//DROP ROLE name;
createuser name;//dropuser name
要决定现有角色的集合,检查pg_roles系统目录,例如:
SELECT rolname FROM pg_roles;
[root@mysqlhq soft]# su - postgres
Last login: Mon Nov 19 10:43:07 CST 2018 on pts/1
-bash-4.2$ psql
psql (9.5.2)
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
exampledb | dbuser | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/dbuser +
| | | | | dbuser=CTc/dbuser
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
postgres=# SELECT rolname FROM pg_roles;
rolname
----------
postgres
dbuser
(2 rows)
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
dbuser | | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
2. 角色属性
一个数据库角色可以有一些属性,它们定义角色的权限并且与客户端认证系统交互。
login privilege
只有具有LOGIN属性的角色才能被用于一个数据库连接的初始角色名称。
CREATE ROLE name LOGIN;
CREATE USER name;
(CREATE USER和CREATE ROLE等效,除了CREATE USER默认假定有LOGIN,而CREATE ROLE不这样认为)。
superuser status
一个数据库超级用户会绕开所有权限检查,除了登入的权利。最好用一个不是超级用户的角色来完成你的大部分工作。要创建一个新
数据库超级用户,使用CREATE ROLE name SUPERUSER。
database creation
一个角色必须被显式给予权限才能创建数据库,要创建这样一个角色,使用CREATE ROLE name CREATEDB。
role creation
一个角色必须被显式给予权限才能创建更多角色,要创建这样一个角色,使用CREATE ROLE name CREATEROLE。
一个带有CREATEROLE权限的角色也可以修改和删除其他角色,还可以授予或回收角色中的成员关系。
initiating replication
一个角色必须被显式给予权限才能发起流复制一个被用于流复制的角色必须还有LOGIN权限。要创建这样一个角色,使用CREATE ROLE name REPLICATION LOGIN。
password
只有当客户端认证方法要求用户在连接数据库时提供一个口令时,一个口令才有意义。password和md5认证方法使用口令。数据库口令与操作系统命令独立。在角色创建
时指定一个口令:CREATE ROLE name PASSWORD ’string’。在创建后可以用ALTER ROLE修改一个角色属性。
提示: 一个好习惯是创建一个具有CREATEDB和CREATEROLE权限的角色,而不是创建一个超级用户,并且然后用这个角色来完成对数据库和角色的例行管理。
这种方法避免了在非必要时作为超级用户操作任务的风险。
一个角色也可以有角色相关的默认值
例如,如果出于某些原因你希望在每次连接时禁用索引扫描(提示:不是好主意)
ALTER ROLE myname SET enable_indexscan TO off;
这将保存设置(但是不会立刻设置它)
要移除一个角色相关的默认设置,使用ALTER ROLE rolename RESETvarname。
3. 角色成员关系
CREATE ROLE name;
GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;
不允许把一个角色中的成员关系授予给PUBLIC。
有INHERIT属性的成员角色自动地具有它们所属角色的权限,包括任何组角色继承得到的权限。
CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;
在作为角色joe连接后,一个数据库会话将立即拥有直接授予给joe的权限,外加任何授予给admin的权限,因为joe“继承了” admin的权限。
然而,授予给wheel的权限不可用,因为即使joe是wheel的一个间接成员,但是该成员关系是通过带NOINHERIT属性的admin得到的。在:
SET ROLE admin;
之后,该会话将只拥有授予给admin的权限,但是没有授予给joe的权限。在执行:
SET ROLE wheel;
之后,该会话将只拥有授予给wheel的权限,但是没有授予给joe或admin的权限。初始的权限状态可以使用下面命令之一恢复:
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
注意: SET ROLE命令总是允许选择原始登录角色的直接或间接组角色。因此,在上面的例子中,在成为wheel之前不必先成为admin。
角色属性LOGIN、SUPERUSER、CREATEDB和CREATEROLE可以被认为是一种特殊权限,但是它们从来不会像数据库对象上的普通权限那样被继承。
要使用这些属性,你必须实际SET ROLE到一个有这些属性之一的特定角色。
4. 删除角色
由于角色可以拥有数据库对象并且能持有访问其他对象的特权, 删除一个角色常常并非一次DROP ROLE就能解决。
任何被该角色所拥有的对象必须首先被删除或者转移给其他拥有者, 并且任何已被授予给该角色的权限必须被收回。
对象的拥有关系可以使用ALTER命令一次转移出去,例如:
ALTER TABLE bobs_table OWNER TO alice;
总之,移除曾经拥有过对象的角色的方法是
REASSIGN OWNED BY doomed_role TO successor_role;//REASSIGN OWNED 命令可以被用来把要被删除的角色所拥有的所有对象的拥有关系转移给另一个角色。
DROP OWNED BY doomed_role;
DROP ROLE doomed_role;
5. 函数和触发器安全性
函数和触发器允许用户在后端服务器中插入代码,其他用户不会注意到这些代码的执行。
PostgreSQL 数据库角色的更多相关文章
- 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析
对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...
- Oracle数据库迁移至PostgreSQL数据库问题及解决
Oracle数据库迁移PostgreSQL数据库问题及解决 目录 如何计划迁移数据库(现状及问题分析) 统计系统表及表功能 解耦公共表 建立数据库 迁移表结构 导入表数据 改SQL语法 保证数据时效性 ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库
最近准备下PostgreSQL数据库开发的相关知识,本文把总结的PPT内容通过博客记录分享,本随笔的主要内容是介绍PostgreSQL数据库的基础信息,以及如何在我们的开发框架中使用PostgreSQ ...
- TPC-H生成.tbl文件导入postgresql数据库的坑
数据库project好好的不用主流的MySQL和Microsoft server而要求用听都没听过的postgresql (当然,可能你三个都没听过) 这里的坑主要是把生成的那八张.tbl的表导入pg ...
- PowerDesigner反向工程PostgreSQL数据库
1. 环境准备: a) 安装PowerDesigner,以PowerDesigner15.1为例 b) 安装java jdk,以jdk-7-windows-i586为例 ...
- 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时 ...
- Enterprise Architect的共享Respository设置,postgresql数据库
Enterprise Architect有一个很实用的共享,在设计UML图的时候,可以连接到一个数据库服务器,将所有的画图数据共享在上面,所有连到这个server的人,都可以看到 别人的图,图中的元素 ...
- SqlServer服务器和数据库角色
首先我们来阐述服务器(实例级别)的权限,实例级别和数据库级别权限的最大不同在于:实例级别的权限是直接授权给登录名,而数据库级别的全显示授予数据库用户的,然后数据库用户再与登录名匹配.(再SqlServ ...
随机推荐
- centos下无法使用lsof命令"-bash: lsof: command not found"
1.问题描述 : 在CentOS下,使用lsof命令,报错如下: 2.解决方法: #yum install lsof 若输入y不能安装成功,通过yum install 包 -y 进行安装: # yum ...
- C语言下文件目录查看
C语言下文件目录遍历通常会用到下面这些函数 _access() /* 判断文件或文件夹路径是否合法 */ _chdir() /* 切换当前工作目录 */ _findfirst() / ...
- linux基础(5)-用户及权限
用户与组 用户:使用linux时,需要以用户的身份登陆 组 :用来方便组织管理用户 用户种类 -root用户(ID为0的用户为root用户) -系统用户(1-499) -普通用户(500以上 ...
- https阿里云证书购买与apache环境配置
1.在阿里云云盾安全->CA证书购买 2.下载证书解压文件,一般有四个文件 3.在/etc/apache2 下创建一个文件夹cert 放入以上四个文件(路径可自己任意选择) 4.$sudo a ...
- js添加后缀防止缓存
jsp页面: 时间戳的话需要引入: <%@ page import="java.util.Date"%> <script type="text/java ...
- Python-flask中数据库连接池DBUtils
一.DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 连接池的三种模式: 第一种模式: 它的缺点:每一次请求反复创建数据库的链接,链接的次数太多 ...
- nova rebuild
nova rebuild¶ usage: nova rebuild [--rebuild-password <rebuild-password>] [--poll] [--minimal] ...
- 使用Putty和Xshell远程登录之密钥认证
本次实验主要使用目前使用最多的Putty和Xshell工具进行实验 关于SSH密钥认证原理,请参考链接:http://www.cnblogs.com/ImJerryChan/p/6661815.htm ...
- 爬虫第四篇:html解析之xpath
在上面的三篇中我们html的解析都是用了正则表达式进行匹配.下面我们主要说一下一个使用起来很简单的模块xpath进行匹配解析html文本. Chrome上有一款插件:XPath Helper,直接在浏 ...
- get、post请求的区别
get.post请求 自己接触前端也是许久时间了,但是对get和post请求的认识也还只是停留在网络上大多数人流传的那样: post比get安全 post可以传大数据,get传的数据量较少: 就这样, ...