百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

Oracle数据库用户管理之角色管理(一)--角色创建及使用

sinye56 2024-09-24 00:01 5 浏览 0 评论

【关键术语】

Role 角色

Enabling role 角色生效

Disabling role 角色失效

Predefined roles 预定义角色

Application roles 应用角色

Default roles 默认角色

3.1 角色概述

3.1.1 角色的作用

● 简化权限管理:

使用角色可简化权限管理。可以将一些权限授予某个角色,然后将该角色授予每个用户,而不是将同一组权限授予多个用户。

● 动态进行权限管理:

如果修改了与某个角色关联的权限,则授予该角色的所有用户都会立即自动获得修改过的权限。

● 有选择地使用权限:

通过启用或禁用角色可以暂时打开或关闭权限。启用角色还可以用来验证用户是否已授予该角色。

当建立用户时,用户没有任何权限。为使用户可以连接到数据库并执行各种操作,必须 为其授予相应的系统权限或对象权限。假定要使用户 A、B、C 能够连接到数据库,并具有创建表的权限和可以在 SCOTT.EMP 表上执行 INSERT、UPDATE 操作,那么需要进行 12次授权操作。如图 P1-1 所示。

如果将来要收回用户 A、B、C 的 INSERT ON SCOTT.EMP 权限,则分别需要从每个用 户处收回该权限,共需要三次收回权限的操作。

因为用户 A,B,C 具有相似的权限需求,我们可以通过角色简化授权和收权操作的次数。假定使用角色,首先可以将这四种权限授予角色 OE,然后将该角色分别授予 A,B,C 用户,只需要进行 7 次授权操作,显然可以降低授权次数。如图 P1-2 所示。

如果要回收用户 A、B、C 的 INSERT ON SCOTT.EMP,那么只需要从角色 OE 处收回INSERT ON SCOTT.EMP 对象权限就可以了。

所以,角色使得权限的授予和回收变得方便和简化了。

结论:

在大多数系统中,将必需的权限一个一个授予每一个用户是很耗时的工作,而且很有可

能会出错。Oracle 软件通过角色可实现简单且受控的权限管理。角色是可授予用户或其它

角色的、由相关权限组成的一些命名组。角色的设计目的是为了简化数据库中的权限管理,

从而可提高数据库的安全性。

角色特性:

  • ? 角色就像用户,可以授予角色或撤销角色权限。
  • ? 角色就像系统权限,可以授予用户或其它角色,也可以从用户或其它角色撤销。
  • ? 角色可以由系统权限和对象权限组成。
  • ? 可以对授予某一角色的每一个用户启用或禁用该角色。
  • ? 可能需要口令才能启用角色。
  • ? 角色不由任何用户拥有,角色也不属于任何方案。

3.1.2 系统预定义角色

角色是一组相关权限的命名集合,使用角色最主要的目的是简化权限管理。当建立数据

库、安装了数据字典和 PL/SQL 包之后,Oracle 会自动建立一些预定义角色。下面介绍一

些 Oracle 常用的预定义角色:

功能角色

已经创建了一些授权您管理特殊功能的其它角色(如果已安装这些功能)。例如,

XDBADMIN 包含管理扩展标记语言(XML) 数据库(如果已安装此功能)所需的权限。

AQ_ADMINISTRATOR_ROLE 提供管理高级队列的权限。HS_ADMIN_ROLE 包括管理异种服务所需的权限。在没有 Oracle 技术支持协助的情况下,一定不能改变授予这些功能角色的权限,因为这样做可能会无意禁用所需的功能

1)CONNECT 角色

? Oracle 10g R2之前:

  • 1 CREATE SESSION
  • 2 CREATE TABLE
  • 3 CREATE VIEW
  • 4 CREATE SYNONYM5 CREATE CLUSTER
  • 6 CREATE DATABASE LINK
  • 7 CREATE SEQUENCE
  • 8 ALTER SESSION

? Oracle 10g R2之后:

oracle CONNECT 角色现在只有这一个权限: CREATE SESSION

如果想还原原来的 oracle CONNECT 角色的设置,Oracle 提供了下面的脚本:

$ORACLE_HOME/rdbms/admin/rstrconn.sql.

2)RESOURCE 角色

  • 1 CREATE CLUSTER
  • 2 CREATE SEQUENCE
  • 3 CREATE TRIGGER
  • 4 CREATE TABLE
  • 5 CREATE PROCEDURE
  • 6 CREATE TYPE
  • 7 CREATE OPERATOR
  • 8 CREATE INDEXTYPE

从 role_sys_privs 中看 ORACLE resource 角色的权限:

SQL> select PRIVILEGE from role_sys_privs where role='RESOURCE'; 

当把 ORACLE resource 角色授予一个 user 的时候,不但会授予 ORACLE resource 角色

本身的权限,而且还有 unlimited tablespace 权限。

1 SQL> conn desk 
2 Enter password: 
3 Connected. 
4 SQL> select PRIVILEGE from user_sys_privs; 
5 no rows selected 
6 SQL> conn / as sysdba 
7 Connected. 
8 SQL> grant resource to desk; 
9 Grant succeeded. 
10 SQL> conn desk 
11 Enter password: 
12 Connected. 
13 SQL> select PRIVILEGE from user_sys_privs; 
14 PRIVILEGE 
15 ---------------------------------------- 
16 UNLIMITED TABLESPACE 
17 SQL> 
18
当把 resource 授予一个 role 时,就不会授予 unlimited tablespace 权限 
19 SQL> show user 
20 USER is "SYS" 
21 SQL> create role testrole identified using testrole; 
22 Role created. 
23 SQL> revoke resource from desk; 
24 Revoke succeeded. 
25 SQL> grant resource to testrole; 
26 Grant succeeded. 
27 SQL> grant testrole to desk; 
28 Grant succeeded. 
29 SQL> conn desk 
30 Enter password: 
31 Connected. 
32 SQL> select privilege from user_sys_privs; 
33 no rows selected 
34 SQL> 

3)DBA 角色

DBA 是在建立数据库时 Oracle 执行脚本 SQL.BSQ 自动建立的角色,该角色具有所有 系统权限以及 WITH ADMIN OPTION 选项。

要注意的是,CONNECT、RESOURCE、DBA 三种角色是为与先前版本兼容而保留的, 在将来版本中可能不会自动建立。

4)EXP_FULL_DATABASE 角色

EXP_FULL_DATABASE 角色是在安装数据字典时执行 CATEXP.SQL 脚本建立的角色,

该角色用于执行数据库的完全导出和增量导出操作,并且它包含以下一些权限和角色:

系统权限 SELECT ANY TABLE、BACKUP ANY TABLE、EXECUTE ANY PROCEDURE、

EXECUTE ANY TYPE、ADMINISTER RESOURCE MANAGER,在表 SYS.INCVID、SYS.

INCFIL 以 及 SYS . INCEXP 上 的 INSERT 、 DELETE 和 UPDATE 对 象 权 限 , 以 及

EXECUTE_CATALOG_ROLE 和 SELECT_CATALOG_ROLE 角色。

5)IMP_FULL_DATABASE 角色

IMP_FULL_DATABASE 角色也是在安装数据字典时执行 CATEXP.SQL 脚本建立的角

色,该角色用于执行完全数据库导人操作,它包含了 EXECUTE CATALOG ROLE 和

SELECT_CATALOG_ROLE 角色以及大量系统权限(查询 DBA_ SYS_ PRIVS)。

6)DELETE_CATALOG_ROLE 角色

DELETE_CATALOG_ROLE 是在建立数据库时 Oracle 执行 SQL.BSQ 自动建立的角色,该角色提供了在系统审计表 SYS.AUD$上的 DELETE 对象权限。

7)EXECUTE_CATALOG_ROLE 角色

EXECUTE_CATALOG_ROLE 是在建立数据库时 Oracle 执行 SQL.BSQ 自动建立的角

色,该角色提供了对所有系统 PL/SQL 包的 EXECUTE 对象权限。

8)SELECT_CATALOG_ROLE 角色

SELECT_CATALOG_ROLE 是在建立数据库时 Oracle 执行 SQLBSQ 自动建立的角色,

该角色提供了在所有数据字典上的 SELECT 对象权限。

3.2 创建和使用角色

3.2.1 创建角色

尽管在设计应用时可以直接使用预定义角色,但出于安全考虑,Oracle,建议使用自定

义角色。建立角色是使用命令 CREATE ROLE,由 DBA 来完成的,但如果要以其他用户身

份建立角色,那么要求该用户必须具有 CREATE ROLE 系统权限。

1.建立角色:不验证

采用不验证方式建立的角色,只是在数据字典中存放角色名称的信息,并且在使角色生

效时不需要进行任何检查。

【实例 1-1】创建不需要验证的角色 oe_clerk。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)创建角色 
SOL>CREATE ROLE oe_clerk; 
角色已创建 

与用户类似,角色也可以进行验证,以确保角色的安全性。

2.建立角色:数据库验证

数据库验证是指使用数据库检查角色及其口令的方式。当采用这种方式时,角色名及口

令是存放在数据库中的。当使角色生效时,必须提供口令。

【实例1-2】创建数据库验证的角色 hr_clerk。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA已连接。 
2)创建角色 
SOL>CREATE ROLE hr_clerk 
IDENTIFIED BY bonus; 
角色已创建 

3.建立角色:外部验证

外部验证是指使用操作系统服务或网络服务检查角色的方式。

【实例 1-3】创建外部验证的角色 hr_manager。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)创建角色 
SOL>CREATE ROLE hr_manager 
IDENTIFIED EXTERNALLY; 
角色已创建 

4.建立应用角色

通过使用应用角色可以避免激活角色,采用这种方式建立角色之后,使角色生效是由认

证包来完成的。

【实例 1-4】创建应用角色 admin_role。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)创建角色 
SOL>CREATE ROLE admin_role 
IDENTIFIED USING hr.pcrt; 
角色已创建 

其中 USING 子句用于指定认证包。当建立了应用角色 admin_role 之后,该角色可以由

HR 用户的 pcrt 包中的任何过程或函数激活。

角色创建后,角色没有任何权限。为了使得角色分配给用户后,用户具有相应权限,就

必须为角色授予系统权限或对象权限。给角色授权与给用户授权的方法完全相同。

【实例1-5】给角色授系统权限。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)角色授权 
SOL>GRANT CREATE SESSION,CREATE TABLE,CREATE VIEW 
TO oe_clerk WITH ADMIN OPTION; 
授权成功。 

这样,当用户具有角色 oe_clerk 时,该用户就可以连接到数据库,并能创建表。另外,

因为在授予这些系统权限时带有 WITH ADMIN OPTION 选项,所以具有该角色的用户还可

以将这些系统权限授予其他用户或角色。

注意,UNLIMITED TABLESPACE 系统权限不能被授予角色;当将对象权限授予角色

时,不能带有 WITH GRANT OPTION。

3.2.2 用控制台创建角色

用控台创建角色的步骤如下:

3.2.3 分配角色

分配角色是指将角色分配给某用户。在建立了角色并为其授予了权限之后,必须将该角

色分配给用户,它才能起作用。分配角色与授予系统权限的命令完全相同。当将角色分配给

用户时,用户将具有角色的所有系统权限和对象权限。一般情况下,分配角色是由 DBA 来

完成的,如果要以其他用户身份分配角色,则要求该用户必须具有 GRANT ANY ROLE 系

统权限或角色的 WITH ADMIN OPTION 选项。

【实例 1-6】把角色 oe_clerk 分配给用户 devp。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)分配角色 
SOL>GRANT oe_clerk TO devp ; 
授权成功。 
2)创建表 
SQL>connect devp/development 
已连接。 
SQL>CREATE TABLE tt(a int); 
表已创建。 

把角色分配给 devp 用户后,用户 devp 就具有角色的所有权限了。

【实例 1-7】把角色 hr_manager 分配给用户 devp。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)分配角色 
SOL>GRANT hr_manager TO devp WITH ADMIN OPTION; 
授权成功。 

这里,在分配角色时使用了 WITH ADMIN OPTION 选项,这样该用户将具有如下权利:

  • ? 将这个角色再授予其它用户。
  • ? 从任何具有这个角色的用户那里回收该角色
  • ? 删除和修改这个角色

因此,在为用户分配角色时应当谨慎使用 WITH ADMIN OPTION 选项,因为该用户将对角色具有完全控制能力。

3.2.4 用控制台分配角色

以下是使用控制台分配角色的步骤:

3.2.5 默认角色

默认角色是用户所具有的角色的子集,当为用户指定了默认角色后,以该用户身份登录

时会自动激活其默认角色,即用户具有了角色的权限。当我们为用户分配了角色之后,只要

没有用 ALTER USER …DEFAULT ROLE 作过修改,那么这些角色都是用户的默认角色。但

有时要把某些角色设为默认角色,有些角色不是默认角色,就要用命令显式设定。设置默认

角色一般是由 DBA 来完成的,如果要以其他用户身份设置用户的默认角色,则要求该用户

必须具有 ALTER USER 系统权限。

1.把用户的所有角色都设为默认角色

使用 ALTER USER 命令可以把一个用户的所有角色都设置为默认角色,这样,当以该

用户身份登录之后,系统会自动激活该用户的所有角色,用户就具有了角色的所有权限。

【实例 1-8】把用户 devp 的所有角色都设置为默认角色,并查看该用户当前激活的角色。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)设置默认角色 
SOL>ALTER USER devp DEFAULT ROLE ALL; 
用户已更改。 
3)以 devp 帐户登录 
SOL>connect devp/development 
已连接。 
4)查看 devp 用户当前激活的角色
SOL>SELECT * FROM session_roles; 
ROLE 
------------ 
HR_CLERK 
OE_CLERK 

2.指定除某些角色外其他角色都为默认角色

在为用户分配了多个角色之后,可以明确指明多数角色为默认角色,使少数几个角色成

为非默认角色。

【实例 1-9】指定除某些角色外其他角色都为默认角色,并验证。

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)设置默认角色 
SOL>ALTER USER devp DEFAULT ROLE ALL EXCEPT hr_manager; 
用户已更改。 
3)以 devp 帐户登录 
SQL>connect devp/development 
已连接。 
4)验证 devp 权限 
SQL>delete from scott.salgrade where grade=1; 
ERROR 位于第 1 行: 
ORA-00942: 表或视图不存在 

因为未将 hr_manager 角色设置为 devp 用户的默认角色,所以以 devp 用户身份登录后 不会激活 hr_manager 角色。此时该用户将不能执行 hr_manager 角色所具有的权限操作。

3.指定某些角色为用户的默认角色

在为用户分配了多个角色之后,如果只是要将少数角色设置为默认角色,那么可以使用

如下方法。

【实例 1-10】把用户 devp 的某些角色设置为默认角色

1)以管理员身份登录 
SOL>CONNECT / AS SYSDBA 
已连接。 
2)设置默认角色 
SOL>ALTER USER devp DEFAULT ROLE oe_clerk; 
用户已更改。 
SQL>connect devp/development
已连接。 
3)验证角色 
SOL>SELECT * FROM session_roles; 
ROLE 
------------ 
OE_CLERK 
SQL>delete from scott.salgrade where grade=1; 
ERROR 位于第 1 行: 
ORA-00942: 表或视图不存在 

因为用户 devp 的默认角色被设置为 oe_clerk,所以,以 devp 用户身份登录后只会激活角色 oe_clerk,并且只能执行这种角色所允许的权限操作。

4.指定无默认角色

在建立了用户之后,可以指定用户无任何默认角色。方法如下:

SOL>connect / AS SYSDBA 
已连接。 
SOL>ALTER USER alex DEFAULT ROLE NONE; 
用户已更改。 

因为没有给 Alex 用户设置默认角色,所以以 Alex 用户身份登录之后不会激活任何角色,从而使得该用户不能执行任何角色所具有的权限操作。

写在最后的话

感谢各位的支持与阅读,后续会继续推送相关知识和交流,欢迎交流、转发和关注,感谢

相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: