Oracle数据库用户管理之二---权限授权去权(用户和角色)

                            Oracle数据库用户管理之二---权限授权去权(用户和角色)

书接上回,https://blog.csdn.net/alwaysbefine/article/details/112133204Oracle系统不管是从安装的角度还是从安装后的使用以及后期的维护这些角度来说都十分的复杂,同样的,Oracle有一套用户系统,如何认识并管理这些用户是一个比较基本也比较重要的问题。

1,Oracle数据库系统的内置用户组成

刚安装完毕Oracle这个软件后,Oracle提供了一些系统内置的用户和角色,这些用户角色我们可以称为基础用户(角色),通过SQL语句 select * from dba_users order by username;可以查询到系统的所有用户,可能根据安装时所选组件的不同,内置用户的数量也可能会不同(没有专门验证,应该是如此的),但大部分用户都是锁定并密码过期的状态,其中的sys,system,scott用户是开箱即用的用户,并且sys登陆时通常需要指定身份为sysdba,也就是系统管理员身份,system用户自带dba角色,scoot用户是普通用户并且一般是锁定状态的(不像别的用户是锁定并且密码过期,该用户并无密码,只是锁定状态)。也就是说,安装完毕后系统提供的可使用用户是三个,sys,system,scoot。

 sys权势滔天,相当于Linux系统内的root用户,安理会的五常,Oracle系统内的上帝。

system 相对sys少6个权限,但由于具有dba角色,因此也是权势滔天,相当于二把手,上帝的副手,Oracle系统内的唯二大佬。

scoot是Oracle公司艾莉森所招聘的第一个程序员名称,仅为纪念这名叫思考特的程序员而设立的普通用户,所具有的权限和角色少的可怜。

那么,剩下的用户锁定就锁定吧,密码过期就过期吧,我们也不用它们,我们只需要自定义用户并赋予自定义用户权限和角色就好了。因此,sys,system,scoot用户如果设定了密码,请牢记哦。(通常,这几个用户的密码设定在安装的时候设定。不设定这几个用户的密码你是安装不了Oracle的:笑~~~)。

小结:安装完毕Oracle系统后,好好看看系统内置用户吧,也没多少个,11g才30个左右而且大部分是锁定过期的不可用用户。牢记SQL语句:

select * from dba_users order by username;

2,Oracle数据库系统的所有权限

查询所有权限:登陆sys用户,执行SQL语句: select * from session_privs order by PRIVILEGE; --其余用户只能查到202个权限,其它所有用户都是查询到202个权限。输出如下:权限可划分为系统权限和对象权限。(例如,select table是对象权限,对象通常指表,视图这样的对象,alter user,create user,create role 这样的权限划分为系统权限)

ADMINISTER ANY SQL TUNING SET
ADMINISTER DATABASE TRIGGER
ADMINISTER RESOURCE MANAGER
ADMINISTER SQL MANAGEMENT OBJECT
ADMINISTER SQL TUNING SET
ADVISOR
ALTER ANY ASSEMBLY
ALTER ANY CLUSTER
ALTER ANY CUBE
ALTER ANY CUBE DIMENSION
ALTER ANY DIMENSION
ALTER ANY EDITION
ALTER ANY EVALUATION CONTEXT
ALTER ANY INDEX
ALTER ANY INDEXTYPE
ALTER ANY LIBRARY
ALTER ANY MATERIALIZED VIEW
ALTER ANY MINING MODEL
ALTER ANY OPERATOR
ALTER ANY OUTLINE
ALTER ANY PROCEDURE
ALTER ANY ROLE
ALTER ANY RULE
ALTER ANY RULE SET
ALTER ANY SEQUENCE
ALTER ANY SQL PROFILE
ALTER ANY TABLE
ALTER ANY TRIGGER
ALTER ANY TYPE
ALTER DATABASE
ALTER DATABASE LINK
ALTER PROFILE
ALTER PUBLIC DATABASE LINK
ALTER RESOURCE COST
ALTER ROLLBACK SEGMENT
ALTER SESSION
ALTER SYSTEM
ALTER TABLESPACE
ALTER USER
ANALYZE ANY
ANALYZE ANY DICTIONARY
AUDIT ANY
AUDIT SYSTEM
BACKUP ANY TABLE
BECOME USER
CHANGE NOTIFICATION
COMMENT ANY MINING MODEL
COMMENT ANY TABLE
CREATE ANY ASSEMBLY
CREATE ANY CLUSTER
CREATE ANY CONTEXT
CREATE ANY CUBE
CREATE ANY CUBE BUILD PROCESS
CREATE ANY CUBE DIMENSION
CREATE ANY DIMENSION
CREATE ANY DIRECTORY
CREATE ANY EDITION
CREATE ANY EVALUATION CONTEXT
CREATE ANY INDEX
CREATE ANY INDEXTYPE
CREATE ANY JOB
CREATE ANY LIBRARY
CREATE ANY MATERIALIZED VIEW
CREATE ANY MEASURE FOLDER
CREATE ANY MINING MODEL
CREATE ANY OPERATOR
CREATE ANY OUTLINE
CREATE ANY PROCEDURE
CREATE ANY RULE
CREATE ANY RULE SET
CREATE ANY SEQUENCE
CREATE ANY SQL PROFILE
CREATE ANY SYNONYM
CREATE ANY TABLE
CREATE ANY TRIGGER
CREATE ANY TYPE
CREATE ANY VIEW
CREATE ASSEMBLY
CREATE CLUSTER
CREATE CUBE
CREATE CUBE BUILD PROCESS
CREATE CUBE DIMENSION
CREATE DATABASE LINK
CREATE DIMENSION
CREATE EVALUATION CONTEXT
CREATE EXTERNAL JOB
CREATE INDEXTYPE
CREATE JOB
CREATE LIBRARY
CREATE MATERIALIZED VIEW
CREATE MEASURE FOLDER
CREATE MINING MODEL
CREATE OPERATOR
CREATE PROCEDURE
CREATE PROFILE
CREATE PUBLIC DATABASE LINK
CREATE PUBLIC SYNONYM
CREATE ROLE
CREATE ROLLBACK SEGMENT
CREATE RULE
CREATE RULE SET
CREATE SEQUENCE
CREATE SESSION
CREATE SYNONYM
CREATE TABLE
CREATE TABLESPACE
CREATE TRIGGER
CREATE TYPE
CREATE USER
CREATE VIEW
DEBUG ANY PROCEDURE
DEBUG CONNECT SESSION
DELETE ANY CUBE DIMENSION
DELETE ANY MEASURE FOLDER
DELETE ANY TABLE
DEQUEUE ANY QUEUE
DROP ANY ASSEMBLY
DROP ANY CLUSTER
DROP ANY CONTEXT
DROP ANY CUBE
DROP ANY CUBE BUILD PROCESS
DROP ANY CUBE DIMENSION
DROP ANY DIMENSION
DROP ANY DIRECTORY
DROP ANY EDITION
DROP ANY EVALUATION CONTEXT
DROP ANY INDEX
DROP ANY INDEXTYPE
DROP ANY LIBRARY
DROP ANY MATERIALIZED VIEW
DROP ANY MEASURE FOLDER
DROP ANY MINING MODEL
DROP ANY OPERATOR
DROP ANY OUTLINE
DROP ANY PROCEDURE
DROP ANY ROLE
DROP ANY RULE
DROP ANY RULE SET
DROP ANY SEQUENCE
DROP ANY SQL PROFILE
DROP ANY SYNONYM
DROP ANY TABLE
DROP ANY TRIGGER
DROP ANY TYPE
DROP ANY VIEW
DROP PROFILE
DROP PUBLIC DATABASE LINK
DROP PUBLIC SYNONYM
DROP ROLLBACK SEGMENT
DROP TABLESPACE
DROP USER
ENQUEUE ANY QUEUE
EXECUTE ANY ASSEMBLY
EXECUTE ANY CLASS
EXECUTE ANY EVALUATION CONTEXT
EXECUTE ANY INDEXTYPE
EXECUTE ANY LIBRARY
EXECUTE ANY OPERATOR
EXECUTE ANY PROCEDURE
EXECUTE ANY PROGRAM
EXECUTE ANY RULE
EXECUTE ANY RULE SET
EXECUTE ANY TYPE
EXECUTE ASSEMBLY
EXEMPT ACCESS POLICY
EXEMPT IDENTITY POLICY
EXPORT FULL DATABASE
FLASHBACK ANY TABLE
FLASHBACK ARCHIVE ADMINISTER
FORCE ANY TRANSACTION
FORCE TRANSACTION
GLOBAL QUERY REWRITE
GRANT ANY OBJECT PRIVILEGE
GRANT ANY PRIVILEGE
GRANT ANY ROLE
IMPORT FULL DATABASE
INSERT ANY CUBE DIMENSION
INSERT ANY MEASURE FOLDER
INSERT ANY TABLE
LOCK ANY TABLE
MANAGE ANY FILE GROUP
MANAGE ANY QUEUE
MANAGE FILE GROUP
MANAGE SCHEDULER
MANAGE TABLESPACE
MERGE ANY VIEW
ON COMMIT REFRESH
QUERY REWRITE
READ ANY FILE GROUP
RESTRICTED SESSION
RESUMABLE
SELECT ANY CUBE
SELECT ANY CUBE DIMENSION
SELECT ANY DICTIONARY
SELECT ANY MINING MODEL
SELECT ANY SEQUENCE
SELECT ANY TABLE
SELECT ANY TRANSACTION
SYSDBA
SYSOPER
UNDER ANY TABLE
UNDER ANY TYPE
UNDER ANY VIEW
UNLIMITED TABLESPACE
UPDATE ANY CUBE
UPDATE ANY CUBE BUILD PROCESS
UPDATE ANY CUBE DIMENSION
UPDATE ANY TABLE

这些权限中常用的是关于建表,删表,修改表,建立删除用户角色,建立连接这些权限,比如,create table,create any table,create user ,create session ,create role 等等。

查询某个用户所有的权限:select * from session_privs order by PRIVILEGE;--需要登录这个用户哦,查询的是这个用户的系统权限

以上202个权限都是系统权限,常用的权限是所有关于表,视图的权限,也就是包含有table,view 字样的权限。比如,create table,create any table(any表示没有用户限制,比如,建表,有这个any权限就可以给任何用户建立表,包括自己)

 

3,Oracle数据库系统的内置角色

角色是什么鬼?其实,角色就是权限的一个逻辑集合。说人话,角色就是一些权限组合后给起了一个名字,既然是一个集合了那么权限就是最小粒度了,也就是说一个角色可能只有一个权限。也可能有n个权限。把一些指定的权限聚拢到一起给取了一个名字,这个名字就是角色。

那么,有哪些权限的逻辑集合---角色呢?SQL查询语句为:select * from dba_roles order by role; 在11g这个版本大概有50多个内置角色,其中有一个角色就叫dba。

这个dba是角色里的大佬,基本数据库的权限这一个角色都拥有, 查看某个角色拥有的权限,这里以dba这个角色为例,SQL语句如下:

select * from role_sys_privs where role='DBA' order by PRIVILEGE;

大致输出如上,可以看到 dba这个角色权限涵盖方方面面,系统权限,对象权限基本都有的哦,其实,前面介绍的system为什么如此不凡,最大的原因是因为有dba这个角色。

证明system用户拥有dba角色的SQL语句为:SELECT GRANTEE,GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE ='SYSTEM';--查询system用户所拥有的角色。

同样的,要想查询scott 这个用户有哪些角色,SQL语句为:SELECT GRANTEE,GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE ='SCOTT';--查询scott用户所拥有的角色。

这里需要提醒,所有grantee后面跟的引号内的内容必须全部大写才可以查到内容,否则不报错,不会返回任何内容。

也就是说,角色dba是所有角色的大佬,基本所有权限都在这个角色里包含了。

还一个常用的角色是 resource,可以看看这个resource 角色有哪些权限:select * from role_sys_privs where role='RESOURCE' order by PRIVILEGE; 当然,resource这个角色相对dba 权限是比较少的,适合完成一些基本的任务,比如建个自用的表等等这些事。

还有一个隐藏角色,看不到摸不着的角色public,很多人说它是所有用户的一个集合,这里就仁者见仁智者见智了。这个东西由于是隐藏的,因此不少血雨腥风都由它而起,怎么个血雨腥风是后话,以后会详细说说这个public。

4,用户和权限的结合与分离---授权和去权

权限之于用户,就像盐和面包,就像水和食物,用户要发挥作用必定需要权限,有了权限才能限定用户能做什么,不能做什么,在Oracle系统中,默认未授予的权限用户就不能使用,只有授予了某一项权限,用户才可以做这一个权限所允许的事情,比如 create user,只有这个用户有这个权限或者继承过这个权限才可以新建用户的。废话这么多,下面就开始说说授权和去权。

(1),新建用户 zsk  SQL语句如下: create user zsk;--使用system或者sys用户创建新用户,因为初始就这么两个高权限用户,没得选择了嘛。

(2),还是在sys用户下执行SQL语句:SELECT GRANTEE,GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE ='ZSK'; --没有输出,表示这个用户确实是一个干净的无任何权限用户

(3),赋权语句,grant  xxx,xxx,xxxx to 用户名;比如,SQL语句:grant create session,create table,create any table to zsk;--赋予用户zsk 登陆,建表的权限。 这三个权限是系统权限,不是对象权限哦。因此,查询它的权限是语句为:select * from dba_sys_privs where grantee='ZSK';--输出结果为:

需要注意的是,第三个选项 admim_option 的值都为no,表示zsk这个用户并无权限将自身的权限向别的用户授权的权限。也就是我们常说的级联授权。

同时赋权的时候还有两个后缀,一个是 with admin option,比如上面的语句加这个后缀就是 :grant create session,create table,create any table to zsk with admin option;-

查询zsk所具有的系统权限的SQL语句为:select * from dba_sys_privs where grantee='ZSK';-输出结果为:

此时的zsk这个用户拥有将 它所现有的权限admin_option 列的值为yes的权限授予它人的权力,说人话就是,有yes的权限可以传递给其它用户了,比如,新增一个用户zsk1,然后登陆zsk 这个用户,将以上三个权限赋予zsk1,只要三个权限是yes,那么必定也可以赋权给其它用户,搞运维时间长的人立刻就明白了,卧槽,这不就是sudo了嘛 。是的,级联就是sudo。

另一个后缀是 with grant option,这个后缀是sudo对象权限的哦,如果你不服气,哼,我就要用这个后缀给系统权限sudo,不好意思,会报错的哦。比如,还是上面那个赋权:

系统明确告诉你,也就是上图最后一行,它请你指定 admin option,这下,小伙伴们不用担心分不清系统权限和对象权限了。

对象权限也就是select,drop,alter,update,truncate,insert 这些针对表和视图操作的权限,比如查询某个用户的所属表,删除某个用户下的表的权限等等,这些就是对象权限。

那么,我们给zsk用户查询 sys用户下的access$表的权限,不加sudo权限后缀。SQL语句为:grant select on sys.access$ to zsk;

此时,查询zsk用户的对象权限,SQL语句为:select * from dba_tab_privs where grantee='ZSK';--输出如下:

此时,第六列的值为no,如果加sudo后缀了,那么第六列将变为yes。SQL语句为:grant select on sys.access$ to zsk with grant option;

查询zsk用户的对象权限语句为:select * from dba_tab_privs where grantee='ZSK';--请注意两个绿色的不同哦

系统权限的赋权一般为 to 用户,对象权限的赋权一般为on 用户

(4),去权操作

revoke 权限  from 用户; 例如,以上的zsk用户,现在有四个权限,现在去掉它的新建表权限,查询sys用户表access$权限,可以这么做:

revoke create table,create any table from zsk;

revoke select on sys.access$ from zsk;

去权需要注意三点, 1,多个同类型权限之间使用 , 隔开。 2.系统权限和对象权限不可混合,也就是又写系统权限又写对象权限,然后revoke,那样会报错,同样的,赋权时也不可混合。3,去权成功后不可反复去权,那样也会报错。

5,角色的赋权和去权操作

为了更好的说明这个问题,还是使用前面所新建立的用户zsk和系统管理员用户sys操作。

(1),用户名和角色名不可同名

首先登陆sys用户,查看有多少个角色:select * from dba_roles order by role; --可以看到并没有zsk这个角色,

查看有哪些用户,select * from dba_users order by username;--可以看到有zsk这个用户。

create role zsk;--此时,会报错,用户名和角色不可重复,因此,角色名更改为zsk_role  再次新建:create role zsk_role;  成功建立角色。

(2),查看这个新建角色 zsk_role  现在有哪些权限?

select * from role_sys_privs where role='ZSK_ROLE' order by PRIVILEGE;--并没有查到角色的任何权限

(3),给zsk_role 这个角色赋予新建用户的系统权限 create user

grant create user to zsk_role;--可以看到角色赋权与用户赋权基本没什么变化

(4),将角色赋予用户zsk

grant zsk_role to zsk;--像一个权限一样把角色分配给用户。

(5),登陆zsk用户,新建一个其它的普通用户,查看是否有新建用户权限。

可以看到zsk用户有新建用户的权限了。

(6)此时登陆sys用户,查看zsk的权限并不会看到有create user 这个权限,但查询zsk所拥有的角色,可以看到 zsk_role 这个角色。

select * from dba_tab_privs where grantee='ZSK';

SELECT GRANTEE,GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE ='ZSK';

7),登陆sys用户,给zsk_role 这个角色赋予查询sys下的alter_qt 表的权限

grant select on sys.alert_qt to zsk_role;--此时,切换到zsk用户,可以查询 sys下的 alert_qt 表了。

(8),一个用户多角色的问题--激活,以及禁止角色的权限。

前面也说了,角色是权限的集合,以上实验也验证了什么权限都可以塞到角色里,但一个用户可以有多个角色,假设zsk用户有很多角色,此时,我们要选定一个角色为默认角色。这个选定动作称为激活。

SQL语句为: set role zsk_role;--在zsk用户下操作,那么别的角色权限将不生效,仅仅使用zsk_role 角色的权限。

如果任何角色都不像使用,只想使用别的用户所直接赋予的权限呢? 执行SQL语句: set role none ;即可。

切换到zsk用户,执行set role none;--此时,在新建用户不会成功。也就是说 set role none;表示用户不使用任何角色。

 

 

 

总结一下:

select * from dba_roles order by role;--所有的角色

select * from dba_users order by username;--所有的用户

select * from dba_tab_privs where grantee='ZSK';--查询zsk用户的对象权限,zsk可替换为你想查询的任一用户。高级权限才可查询

select * from dba_sys_privs where grantee='ZSK';--查询zsk用户的系统权限,zsk可替换为你想查询的任一用户。高级权限才可查询

select * from role_sys_privs where role='ZSK_ROLE' order by PRIVILEGE;--查询zsk_role这个角色的系统权限

select * from role_sys_privs where role='DBA' order by PRIVILEGE;--查询dba这个角色的系统权限。202条记录。

select * from role_tab_privs where role='ZSK_ROLE' order by PRIVILEGE;--查询角色的对象权限

select * from role_tab_privs where role='DBA' order by PRIVILEGE;--查询dba这个角色的对象权限。284条记录。

select * from session_privs order by PRIVILEGE;--需要登录这个用户哦,查询的是这个用户的系统权限,需要登录后执行查询,只能查询到当前用户的系统权限。
 

注意级联赋权,也就是类似Linux系统的sudo赋权,两种权限不要指望可以混合。

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/alwaysbefine/article/details/112247239