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 ...
随机推荐
- RHCE学习笔记 管理1 (第一、二章)
第一章 命令行访问 1.Ctrl+alt+F2~F6 切到虚拟控制台,ctrl+alt+F1 回到图形界面 2.格式 : 命令 选项 参数 [] 为可选项目 ...表示该项目任意 ...
- ZooKeeper服务-一致性、实现
实现 ZooKeeper服务有两种不同的运行模式.一种是“独立模式”(standalone mode),即只有一个ZooKeeper服务器.这种模式比较简单,适合于测试环境,但是不能保证高可用性和可恢 ...
- 运行tomcat,报错:Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误
运行tomcat时,报错: Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??错误 原因分析: 这是因为之前已开启了一 ...
- nodejs 语法很特别的地方
1. 不过我们之前说过了有 this 和没 this 的时候作用域不同,那个参数只是作用于构造函数中,而加了 this 的那个则是成员变量.用一个 this 就马上区分开来他们了,所以即使同名也没关系 ...
- 0.00-050613_zc
1. ROM bios --> 启动盘第一个扇区(此处内容为boot) 加载到 内存位置0x7C00(31KB) --> 执行权转移(也就相当于跳转) boot程序主要功能:把 软盘/映像 ...
- 企业环境中部署 ActiveMQ
这一章讲述了怎么配置 ActiveMQ 集群.
- Redis主键失效 - 原理及实现机制
[数据记录过期源码][http://blog.csdn.net/yuanrxdu/article/details/21233047] [http://blog.jobbole.com/71095/] ...
- sql处理数据库锁的存储过程
/*--处理死锁 查看当前进程,或死锁进程,并能自动杀掉死进程 因为是针对死的,所以如果有死锁进程,只能查看死锁进程 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程 --邹建 2004.4 ...
- web测试中的测试点和测试方法总结
测试是一种思维,包括情感思维和智力思维,情感思维主要体现在一句俗语:思想决定行动上(要怀疑一切),智力思维主要体现在测试用例的设计上.具有了这样的思想,就会找出更多的bug. 一.输入框 1.字符 ...
- 剑指offer--5.变态跳台阶
WA了一次,错误数据4,输出8,怎么真么熟悉呢?改个return过了,OMG ------------------------------------------------------------- ...