对于数据库来讲,安全性的重要程度不言而喻,今天我们就来聊一聊Oracle的权限体系。

1.账户管理

  在此之前,先解释下一个容易混淆的概念:模式。所谓模式,指的是用户账户所拥有的一组对象(比如表,索引,视图,同义词之类的)。

所以严格意义上来讲它跟账户是不同的概念,切莫混淆。 

创建一个账户

SQL> create user kobe  --用户名必须,不区分大小写

SQL> identified by kobe123 --指定口令,除口令验证之外,还会有其他身份验证方式,如我们常用的操作系统身份验证:conn / as sysdba; 或者通过外部口令文件验证,或是委托给外部身份验证

SQL> default tablespace users --为用户指定一个表空间,非必需,如果不指定,则为数据库默认表空间

SQL> temporary tablespace temp --为用户指定临时表空间,非必需

SQL> quota 100m on users --指定配额,意味着该账户可在users表空间上使用的空间为100m

SQL> profile my_profile --为该账户指定一个配置文件,配置文件的作用会在后面提到

SQL> password expire ;--强制用户立即更改口令 

  上面列举了在创建账户时的常用属性,用户名和身份验证(上面使用的是口令验证方式)是必须的属性,其他都是非必需的,若用户没有指定,一般会使用默认值。

当然,这些属性在后续也可以通过ALTER USER 命令进行修改,比如:

更新口令

SQL> alter user kobe identified by kobe321;  

更改表空间

SQL> alter user kobe default tablespace mytb; 

使用户口令失效,强制其更新口令

SQL> alter user kobe password expire;

锁定用户账户 

SQL> alter user kobe account lock;

解锁用户账户

SQL> alter user kobe account unlock;

删除用户

SQL> drop user kobe; --该命令只有该账户下没有任何模式对象(表,视图等)才可删除成功,否则,可进行级联删除:

SQL> drop user kobe cascade; --级联删除

配置文件:

  前面我们在创建账户时提到的其他账户属性都很容易理解,一些童鞋对于配置文件的作用不是特别明了,这里简单介绍一下:

  配置文件主要有两个作用:一是实施口令策略,(比如口令过期天数,口令输入最高连续错误次数),二是控制资源使用(需要RESOURCE_LIMIT实例参数的配合)

示例:   

SQL> create profile my_profile --指定配置文件名称

SQL> limit session_per_user 10 --指定并发登录数,超过10个会阻塞新登录会话(要使该设置起作用,必须将RESOURCE_LIMIT设置为true)

SQL> password_lift_time 7 --口令过期天数,过期后还可以使用,

SQL> password_grace_time 1 --口令过期后仍可登录的天数,会提示用户更新口令

SQL> failed_login_attempts 5;--最高连续输错口令次数,之后账户会被锁定 

  感兴趣还可以了解下其他的口令策略和控制资源使用配置,此处不再赘述。  

2.权限管理

  上面的账户kobe创建了之后,是无法直接登入数据库的,因为它没有任何权限,来看看Oracle的权限体系是怎样的:

  在Oracle中,权限分为两类,系统权限和对象权限。我们可以通过GRANT 和 REVOKE 命令来对账户进行权限的授予和撤回,一般这些操作会由DBA用户(SYS用户和SYSTEM用户)来执行

  grant基本语法:grant privilege [,privilege....] to username;

2.1系统权限:

  系统权限通常允许用户执行影响数据字典或是影响数据库和实例的操作,比如创建会话,创建表,创建视图的权利(create table其实就是在数据字典中插入一条相应数据); 

  Oracle中常用的权限:

CREATE SESSION:创建会话,若账户没有改权限,则无法连接数据库并创建会话;

CREATE TABLE :创建表,并拥有该表的一系列操作,更改表,删除表及DML命令等;

CREATE TABLESPACE:创建表空间,允许用户自行管理表空间,包括创建和删除表空间;

ALTER DATABASE:更改数据库,允许执行一些修改数据库物理结构的命令,eg:alter database datafile 4 offline;

ALTER SYSTEM : 更改系统,允许用户调整实例参数和内存结构,eg:alter system set processes=1500 scope = spfile;

CREATE ANY TABLE : 创建其他表,允许为其他用户建表(create table 只能为自己建表,而create any table可为其他用户建表)

......

  示例:

为kobe账户授予创建会话,创建表,创建视图,创建同义词的权限:

SQL> grant create session,create table,create view,create synonym to kobe; 

  权限可以进行级联传递:

1.DBA用户登入  

SQL>conn / as sysdba;  

2.为kobe账户授予建表权限:

SQL> grant create table to kobe with admin option;

3.kobe登入

SQL> conn kobe/kobe123;

4.kobe可将建表权限授予james

SQL> grant create table to james; 

  这样,james用户也就有了在自己的模式下建表的权限;

需要注意的是,系统权限的撤销不会级联。

5.以DBA身份登入,撤销kobe的建表权限:

SQL> revoke create table from kobe;   

    kobe的建表权限被撤销了,但通过它授予给james的建表权限不会被撤销,james依然拥有建表权限。

2.2对象权限

对象权限则是赋予用户可操纵一些数据库对象的权利,insert,delete,update,select ,或者执行PL/SQL对象。

基本语法:

  grant privilege on [schema.]object to username [with grant option];

  示例

1.kobe账户登入

SQL> conn kobe/kobe123;  

  2.为james账户授予kobe模式下的对象权限:

SQL> grant select on kobe.emp to james; --授予james在emp表的select权限;

SQL> grant update(ename) on kobe.emp to james;--授予james对ename字段的更新权限;

SQL> grant all on kobe.emp to james; --授予james在emp表上的所有对象权限;

  对象权限也可以传递,比如:

1.kobe账户登入

SQL> conn kobe/kobe123;  

  2.为james账户授予其emp表下的所有对象权限 并允许james进行对象权限的传递:

SQL> grant all on kobe.emp to james with grant option;

  3.james 用户登入

SQL> conn james/james123; 

4.james将kobe模式下的emp表中的所有对象权限授予Iverson:

SQL> grant all on kobe.emp to iverson;   

  这样,iverson也拥有了对kobe下的emp表的所有对象权限,(select,insert ,update,delete 等等)

注意:对象权限不同于系统权限,撤销会级联撤销:

   5.kobe账户撤销授予james表的对象权限:

SQL> revoke all on kobe.emp from james;

  james在emp表上的所有权限将被撤销,同时,通过james传递给iverson的权限也将被撤销收回。这是因为Oracle保留着对象传递的记录。

3.角色管理:

  如果对每一个账户手动一个个的授予权限,太过繁琐了,所以就引入了角色(role)的概念,角色其实就是一组权限的集合(包括系统权限和对象权限),通过为角色分配一组权限,再将角色授予用户以达到授权的目的。同时,为了应付不同场景,还可以临时激活和禁用角色。这样会使得权限管理更加的方便和灵活。如图:

  

Oracle中几个常见的预定义角色:

  CONNECT:该角色在Oracle 11g版本中只拥有CREATE SESSSION的系统权限;

  RESOURCE : 拥有创建数据库对象(table,view,synonym等)的权限;

  DBA: 拥有大多数的系统权限

当然用户也可以自定义角色:

  示例:

SQL> create role base_role; --创建角色

SQL> grant create session,create table ,create view to base_role;--为该角色分配一些基础的系统权限

SQL> grant all on kobe.emp to base_role; --赋予对象权限

SQL> grant base_role to james;--将该角色赋予james

  也可以为角色再分配角色

SQL> create role admin_role;

SQL> grant dba to admin_role;

同时,角色也可以进行传递,同上面进行权限传递的语法是一致的,这里就不赘述了。

角色控制 

  默认情况下,为账户分配了角色,则默认就是启用状态,若要禁用,则可以这样做:

SQL> alter user james default role none; 

  若要启用:

SQL> alter user james default role base_role;

需要注意在Oracle中有个预定义的PUBLIC 角色,这个角色会始终分配给每个数据库用户账户,也就是说给public角色授予权限,就相当于将这些权限下放给了所有数据库用户账户,所以若有对于PUBLIC角色的权限,需要意识到这一点。

4.后记

  本文详细介绍了Oracle安全模型中的一些相关知识,包括用户账户,系统权限,对象权限,角色等以及一些基本的语法。希望可以帮到有需要的童鞋,谢谢支持。  

浅谈Oracle权限体系的更多相关文章

  1. 浅谈oracle树状结构层级查询之start with ....connect by prior、level及order by

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  2. 浅谈Oracle事务【转载竹沥半夏】

    浅谈Oracle事务[转载竹沥半夏] 所谓事务,他是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元.通俗解释就是事务是把很多事情当成一件事情来完成,也就是大家都在一条船上,要 ...

  3. 浅谈oracle树状结构层级查询测试数据

    浅谈oracle树状结构层级查询 oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的,虽然我是一个java程序开发者,我一直觉得只 ...

  4. 浅谈mysql权限

    一.      背景: “去IOE”的本质是“分布式+开源”架构替代“集中式+封闭”架构,变成彻底的云计算服务模式.去“IE”易,并且应该去,关键确实能省钱,而且运维难度不大,替代技术产品成熟.而去O ...

  5. 技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可 ...

  6. 浅谈Oracle表之间各种连接

    Oracle表之间的连接分为三种: 1.内连接(自然连接) 2.外连接 2.1.左外连接(左边的表不加限制,查询出全部满足条件的结果) 2.2.右外连接(右边的表不加限制,查询出全部满足条件的结果) ...

  7. 浅谈Oracle中物理结构(数据文件等。。。)与逻辑结构(表空间等。。。。。)

    初始Oracle时很难理解其中的物理结构和逻辑结构,不明白内存中和硬盘中文件的区别和联系,我也是初学Oracle,这里就简单的谈谈我我看法. 首先,你需要明白的一点是:数据库的物理结构是由数据库的操作 ...

  8. 浅谈Oracle函数返回Table集合

    在调用Oracle函数时为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合 ...

  9. 浅谈Oracle 性能优化

    基于大型Oracle数据库应用开发已有6个年头了,经历了从最初零数据演变到目前上亿级的数据存储.在这个经历中,遇到各种各样的性能问题及各种性能优化. 在这里主要给大家分享一下数据库性能优化的一些方法和 ...

随机推荐

  1. 又一个半成品库 weblog rpc client

    我基本上属于半成品专业户,去看我的github就知道. 下午又撸了一个weblog rpc client库,而这又一次证明了一个有技术但没有产品能力的程序员是没有卵用的. 因为当做好了库的雏形,但与具 ...

  2. 排列组和在c语言中的应用

    排列组和在c中很常见,但是这个排列组和是通过循环来实现的,和数学中的还是有一点区别的,而且c中的方法也不尽相同,而且我遇到c中的数学问题总会纠结于数学上是怎么实现的但是我自己又不会,所以就没了兴趣,例 ...

  3. 基于SSH框架的学生公寓管理系统的质量属性

    系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信 ...

  4. Netty(三)TCP粘包拆包处理

    tcp是一个“流”的协议,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题. 粘包.拆包问题说明 假设客户端分别发送数据包D1和D ...

  5. Java基础学习总结 -- 图形用户界面GUI

    虽然目前Java算不上前端开发的主力,但是作为Java入门基础的一部分,学习Java的GUI编程还是有必要的,而且可以做出一些小且有趣的图形程序来提高学习热情.本篇学习总结均为一个Beginner的笔 ...

  6. Webstorm常用的快捷键

    WS的常用操作: 常用快捷键(Keymap/Eclipse): 复制当前行: Ctrl+Alt+↓ 向上/下移动当前行: Alt+↑/↓ 删除当前行: Ctrl+D 注释/取消当前行: Ctrl+/ ...

  7. ajax大全

    简介 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 传统的web应用简单的操作需要加载全局 ...

  8. border-radius结合transition的一个小应用(动画)

    <head lang="en"> <meta charset="UTF-8"> <title></title> ...

  9. 用JS做一个简单的电商产品放大镜功能

    使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. ...

  10. Android github 快速实现多人协作

    前言:最近要做github多人协作,也就是多人开发.搜索了一些资料,千篇一律,而且操作麻烦.今天就整理一下,github多人协作的简单实现方法. 下面的教程不会出现:公钥.组织.team.pull r ...