创建和管理数据库用户账户

sys 查看数据库里有多少用户?
select username from dba_users;

9.1.1用户的缺省表空间

每个用户账户都可以指定默认的表空间,用户创建的任何对象(如表或索引)将缺省保存在此表空间中,如果创建用户时没有指定默认表空间,那么属于数据库级的默认表空间(DBCA创建数据库时默认是users表空间)将应用于该账户。

SQL> select * from database_properties;            //查看数据库级的默认表空间

SQL> alter database default tablespace tablespace_name;    //可以更改

9.1.2 空间配额的概念:
配额(quota)是表空间中为用户的对象使用的空间量,dba建立用户时就应该考虑限制用户的磁盘空间配额,否则无限制配额的用户可能把你的表空间撑爆(甚至损坏system表空间)。

ALTER USER tim QUOTA 10m ON test_tbs;    --设置限额=10m

ALTER USER tim QUOTA             --不受限制

ALTER USER tim QUOTA 0 ON test_tbs;      --收回限额

考点:

1)要创建表,用户必须具有执行create table的权限,而且拥有在该表使用的表空间上的配额。
2)用户不需要临时表空间上的配额,UNOD表空间也不能针对用户设置配额。

9.2 管理概要文件(profile)(PPT-I-270-272)

作用是对用户访问数据库做一些限制。有几个要点:

1)概要文件(profile)具有两个功能,一个是实施口令限制,另一个是限制会话可以占用的资源。
2)始终要实施口令控制,而对于资源限制,则只有实例参数RESOURE_LIMIT为TRUE时(默认是FALSE)才会实施(考点)。
3)系统自动使用概要文件,有一个默认的default profile,限制很松,作用较小。
4)可以使用create profile为用户创建它自己的概要文件,没有说明的参数就从default profile的当前版本中提取。

Password_parameter部分:
       
       Failed_login_attempts:指定在帐户被锁定之前所允许尝试登陆的的最大次数。
       Password_lock_time:在到达Failed_login_attempts后锁定账户的天数。
       Password_life_time:口令过期前的天数,口令在过期后仍可以使用,具体取决于Password_grace_time
       Password_grace_time:口令过期(将生成更改口令的提示)后第一次成功登录后的天数,在此期间,旧口令仍然可用。
       Password_reuse_time:可以重新使用口令前的天数
       password_reuse_max:可以重新使用口令的次数
       Password_verify_function:更改口令时运行的函数名,此函数一般用于检查新口令所需的复杂程度。

Resource_parameter部分

Session_per_user:对同一个用户账户执行的并发登录数。
       Cpu_per_session:在强制终止会话前,允许会话的服务器进程使用的CPU时间(厘秒)。
       Cpu_per_call:    在强制终止某条SQL语句前,允许会话的服务器进程用于执行此语句的CPU时间。
       Connect_time:    在强制终止会话前,会话的最长持续时间(分钟)。
       Idle_time:    在强制终止会话前,允许会话处于闲置状态的最长时间(分钟)。
       Logical_reads_per_session: 在强制终止会话前,会话可读取的块数(无论块在数据缓冲区还是磁盘)。
       Logical_read_per_call:    在强制终止单个语句前,此语句可读取的块数(无论块在数据缓冲区还是磁盘)。
       Private_sga:    对于通过共享服务器体系结构连接的会话,允许会话的会话数据在SGA中占用的字节数(考点)。
       Composite_limit:前面几个参数的加权和。这是一个高级功能,其需要的配置不在OCP考试范围。

例:

1)创建一个概要文件,如果出现两次口令失误,那么将账户锁定。

SQL> create profile two_error limit failed_login_attempts 2;

2)将概要文件分配给tim用户

SQL> alter user tim profile two_error;

SQL> select username,PROFILE from dba_users where username='TIM';

USERNAME                       PROFILE
------------------------------ ------------------------------
TIM                            TWO_ERROR

3)tim尝试两次登录使用错误密码,系统报出ORA-28000错误

SQL> conn tim/fdfd
ERROR:
ORA-28000: 帐户已被锁定

4)sys为tim解锁
SQL> conn / as sysdba
SQL> alter user tim account unlock;

5)sys删掉了two_error概要文件

SQL> drop profile two_error cascade;        //删除two_error后,tim用户又绑定到default profile上。

//profile参数较多,使用命令方式有些啰嗦,使用EM来管理比较方便。

9.3 更改密码

sys建立用户时给用户一个密码,用户的密码保存在数据字典中,用户登录户再更改密码。这些密码是加密形式存在的,DBA也无法知晓。

sys不知道用户密码,又想临时登录用户账户,但不想打扰用户。怎样做:

SQL> select name,password from user$ where name='SCOTT';

NAME                           PASSWORD
------------------------------ ------------------------------
SCOTT                          F894844C34402B67

SQL> alter user scott identified by tiger;

用户已更改。

SQL> conn scott/tiger
已连接。
SQL> conn / as sysdba

SQL> alter user scott identified by values 'F894844C34402B67';

用户已更改。

SQL>

9.4 系统权限,对象权限,角色

9.4.1 权限的引入:

数据库安全分为系统安全和数据安全

系统安全:用户名和口令,分配给用户的磁盘空间及用户的系统操作,如profile等
数据库安全:对数据库对象的访问及操作

用户具备系统权限才能够访问数据库
具备对象权限才能访问数据库中的对象

1) system privilege:针对于database 的相关权限

系统权限通常由DBA授予 (11g 有200多种,select distinct privilege from dba_sys_privs;也可被其他用户或角色授予)

典型DBA权限
CREATE USER
DROP  USER
BACKUP ANY TABLE
SELECT ANY TABLE
CREATE ANY TABLE

典型用户需要的系统权限
CREATE SESSION
CREATE TABLE
CREATE SEQUENCE
CREATE VIEW
CREATE PROCEDURE

2)object privilege:针对于schema (用户)的object

对象权限有8种:ALTER, DELETE, EXECUTE, INDEX, INSERT, REFERENCES, SELECT, UPDATE

对象权限         表    视图    序列    过程
-------------------------------------------------------------
ALTER            *          *
DELETE            *     *
EXECUTE                      *
INDEX             *    
INSERT             *     *
REFERENCES     *    
SELECT              *     *      *
UPDATE             *     *

3)role:简化权限管理
Oracle预定义角色, 如:CONNECT, RESOURCE, DBA等

用户创建和删除自己的角色
CREATE role myrole;
DROP role myrole;

9.4.2授予系统权限语法:

GRANT sys_privs,[role] TO user|role|PUBLIC [WITH ADMIN OPTION]

//授予角色与系统权限的语法格式是一样的,所以可以并列在一个句子里赋权

授予对象权限语法
GRANT object_privs ON object TO user|role|PUBLIC [WITH GRANT OPTION]

9.4.3 为什么要引入角色:

系统权限太繁杂,将系统权限打包成角色,Oracle建议通过角色授权权限,目的就是为了简化用户访问管理
试验:
sys:    
SQL> create user tim identified by tim;        //建一个tim用户
SQL> conn tim/tim
ERROR:
ORA-01045: 用户 TIM 没有 CREATE SESSION 权限; 登录被拒绝

警告: 您不再连接到 ORACLE。
SQL> conn / as sysdba
已连接。
SQL> grant create session to tim;        //授予tim系统权限create session

SQL> conn tim/tim
已连接。

SQL> select * from tab;

未选定行

SQL> create table a (id int);
create table a (id int)
*
第 1 行出现错误:
ORA-01031: 权限不足
sys:
SQL> grant create table to tim;                //授予tim系统权限 create table
    
tim:                                                                                                
SQL> create table a (id int);
create table a (id int)
*
第 1 行出现错误:
ORA-01950: 对表空间 'USERS' 无权限

sys:
SQL> grant unlimited tablespace to tim;        //授予tim系统权限unlimited tablespace,可以无限制的使用任何表空间

SQL> alter user tim quota 5m on users;        //仅对于使用users 表空间加上了磁盘限额。

tim:
SQL> create table a (id int);

表已创建。

SQL> select * from session_privs;        //这个语句最常用,但其中不包括该用户的对象权限(考点)

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE

列出oracle所有系统权限;
SQL> select distinct privilege from dba_sys_privs;

sys:
SQL>drop user tim cascade;
SQL>create user tim identified by tim;
SQL>grant connect,resource to tim;

SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SEQUENCE
CREATE PROCEDURE
CREATE TRIGGER
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

已选择10行。

需要注意两点:

1)在resource角色里包含了unlimited tablesapce 系统权限,意思是不限制用户使用任何表空间,此权限太大,它包括可以访问system表空间,在实际应用中一般要将此权限收回,然后再对用户限制表空间配额(quoto)。
2)sys将resource角色授权给用户,其中有9个系统权限,只有unlimited tablespace可以单独收回(从角色里收回系统权限的特例)。

SQL> create tablespace test_tbs datafile '/u01/oradata/timran11g/test01.dbf' size 10m;
SQL> create user tim identified by tim default tablespace test_tbs;
SQL> grant connect, resource to tim;
SQL> revoke unlimited tablespace from tim;
SQL> alter user tim quota 10m on test_tbs;

查看用户表空间配额:
SQL> select tablespace_name,username,max_bytes from DBA_TS_QUOTAS where username='TIM';

当unlimited tablespace 和quota共存时,听unlimited的

9.4.4 几个有关权限的考点

1)sys, system 拥有普通用户的所有对象权限,并有代理授权资格。
2)系统权限里的any含义:
sys:
SQL> grant create any table to tim;
tim:
SQL> create table scott.t100 (id int);     //tim为SCOTT建了一张表,这张表是属于SCOTT模式下的一个对象。

3)对象权限一般由对象拥有者授予,也可以由sys或system代理授予。
sys:
grant select on scott.emp to tim;

可以使update对象权限精确到列:

scott:
SQL> grant select, update(sal) on emp to tim;

SQL> revoke update(sal) on emp from tim;
revoke update(sal) on emp from tim
             *
第 1 行出现错误:
ORA-01750: UPDATE/REFERENCES 只能从整个表而不能按列 REVOKE

SQL> revoke update on emp from tim;

授予tim对scott.emp的所有对象权限
SQL> grant all on scott.emp to tim;

几个需要注意的地方:

系统权限和对象权限语法格式不同,不能混合使用 grant create table,select on emp to tim  错(考点)
系统权限和角色语法相同可以并列授权  grant connect,create table to tim    对
可以一条语句并列授予多个用户   grant connect to tim,ran 对
可以通过授权建立用户,如ran用户不存在, grant connect,resource to ran identified by ran; 对

4)系统权限的传递与回收:WITH ADMIN OPTION 选项

sys: 先建立两个测试用户tim和ran

CREATE USER tim IDENTIFIED BY tim;     
CREATE USER ran IDENTIFIED BY ran;

GRANT create session TO tim WITH ADMIN OPTION;

tim:
GRANT create session TO ran
 
收回tim系统权限,ran的系统权限没有收回!
sys:
REVOKE create session FROM tim;

conn ran/ran可以成功

5)对象权限的传递与回收:WITH GRANT OPTION 选项

scott:为tim用户授权

GRANT SELECT ON emp TO tim WITH GRANT OPTION;
tim:
GRANT SELECT ON scott.emp TO ran;

检查tim和ran都能否访问scott.emp ....

scott:回收tim对象权限
REVOKE SELECT ON emp FROM tim;

检查tim和ran都不能访问scott.emp了, ran的对象权限也收回!

9.4.5 对象权限在存储过程中的使用

scott将存储过程proc1的execute权限赋给tim,proc1中包含了一些tim没有权限的DML操作,那么tim能成功地执行存储过程proc1吗?这个问题涉及到了create procedure时invoker_rights_clause的两个选项:(考点)

1、AUTHID CURRENT_USER            //执行存储过程时,要检查用户是否有DML操作的对象权限。
2、AUTHID DEFINER(默认)

测试:

sys:
SQL> create table scott.a (d1 date);
SQL> grant connect,resource to tim identified by tim;
SQL>
scott:
create or replace procedure proc1 as
begin
 insert into scott.a values(sysdate);
 commit;
end;
/

SQL> grant execute on proc1 to tim;

tim:
SQL> exec scott.proc1;

PL/SQL 过程已成功完成。                //有执行存储过程的权限,但没有insert对象权限,竟然也能执行成功。

scott:                        //使用invoker_rights_clause加入AUTHID CURRENT_USER参数再试试。
create or replace procedure proc1 AUTHID CURRENT_USER
as
begin
 insert into scott.a values(sysdate);
 commit;
end;
/

tim:
SQL> exec scott.proc1;
报错!

scott:
SQL> grant all on a to tim;

tim:
SQL> exec scott.proc1;

PL/SQL 过程已成功完成。                //在execute权限和insert权限都具备的情况下使操作成功,这可能是我们想要的。

9.4.6 与权限有关的数据字典

SESSION_PRIVS        //用户当前会话拥有的系统权限
USER_ROLE_PRIVS      //用户被授予的角色
ROLE_SYS_PRIVS       //用户当前拥有的角色的系统权限
USER_SYS_PRIVS       //直接授予用户的系统权限
USER_TAB_PRIVS       //授予用户的对象权限
ROLE_TAB_PRIVS       //授予角色的表的权限

练习: 要掌握权限与角色的关系,以及如何查看信息,

数据字典
dba_xxx_privs
all_xxx_privs
user_xxx_privs

其中xxx:role表示角色,sys表示系统权限,tab表示对象权限。

从哪个角度看,非常重要!
我们举个例子:三个用户,分别是sys,scott,和tim,
sys:
1)建立myrole角色,把connect角色和create table 系统权限以及update on scott.emp对象权限放进myrole。
2)把myrole角色授给tim。
3)把create table 系统权限授给tim。

scott:
把 select on emp表的对象权限授给tim

如此tim用户有了如下角色和权限:

myrole(connect,create table,update on scott.emp)
create table
select on emp

我们从三个角度分析一下,如何里数据字典里查看tim拥有的角色和权限信息。

从dba角度看:

看用户tim所拥有的系统权限
select * from dba_sys_privs where grantee='TIM';

看用户tim所拥有的对象权限
select * from dba_tab_privs where grantee='TIM';

看用户tim所拥有的角色(不包含角色里的角色)
select * from dba_role_privs where grantee='TIM';

查看这个角色里包含的角色
select * from dba_role_privs where grantee='MYROLE';

查看这个角色里包含的系统权限
select * from dba_sys_privs where grantee='MYROLE';

查看这个角色里包含的对象权限
select * from dba_tab_privs where grantee='MYROLE';

从tim用户角度看:

查看和自己有关的角色(不含角色中含有的角色)
select * from user_role_privs;

查看和自己有关的系统权限(不含角色中的系统权限)
select * from user_sys_privs;

查看和自己有关的对象权限(不含角色中的对象权限)

select * from user_tab_privs;

角色里包含的角色
select * from role_role_privs;

角色里包括的系统权限
select * from role_sys_privs;

角色里包括的对象权限
select * from role_tab_privs;

查看和自己有关的系统权限(包括角色里的权限)
select * from session_privs;

从scott用户看是个什么情况

select * from all_tab_privs where grantee='TIM';
select * from all_tab_privs where table_name='EMP';

oracle之创建和管理数据库用户账户的更多相关文章

  1. 【转】使用PowerDesigner的建模创建升级管理数据库

    使用PowerDesigner的建模创建升级管理数据库 PowerDesigner是一种著名的CASE建摸工具,最开始为数据库建模设计,即物理模型(Physical Data Model)用于生成数据 ...

  2. SQL Server 【附】创建"商品管理数据库"、"学生选课数据库"的SQL语句

    附:(创建“商品管理数据库”的SQL语句) --建立"商品管理数据库"数据库-- create database 商品管理数据库 on(name='商品管理数据库_m', file ...

  3. Oracle 12c 创建新的数据库实例、用户

    前提:安装好了Oracle 12c数据库,已有一个数据库实例xe,登录用户/密码:system/oralce 我用的是docker安装的Oracle 12c的实例: docker run --name ...

  4. oracle 11G创建表空间、用户、配置监听和TNS

    最近总在安装各种版本的oralce数据库做测试,11G,32位的,64位的,12C的,每次都折腾表空间,用户.tns啥的,这里记录下,再也不用现用现百度找了 一.创建表空间.用户  在plsql工具中 ...

  5. 管理 MariaDB 用户账户

    哪些用户可以连接到MariaDB 服务器,他们都可以从哪些地方连接,连接到服务器后又能够做什么等,都是本文将涉及到的内容. 用户的权限信息都保存在 mysql 库中的几个权限表中.对 MariaDB ...

  6. Oracle的创建表空间及用户

    学习笔记: 1.创建表空间 --创建表空间 create tablespace thepathofgrace datafile 'c:\thepathofgrace.dbf' size 100m au ...

  7. Oracle Rac创建表空间及用户

    1. 创建表空间: BEGIN DECLARE cnt integer := 0; BEGIN SELECT 1 INTO cnt FROM dual WHERE exists(SELECT * FR ...

  8. oracle 用sql语句管理数据库

    基础sql语句 创建数据库 :create database database_name; 创建表:create table(字段名 字段类型 字段为空约束 ,字段名 字段类型 字段为空约束,,,, ...

  9. oracle 语句创建表空间、用户、授权

    /*分为四步 */ /*第1步:创建临时表空间 */ create temporary tablespace yuhang_temp tempfile 'D:\oracledata\yuhang_te ...

随机推荐

  1. day 10 面向对象(=)

    1.魔法对象  __str _(self)     使用print(对象)输出的时候,自动调用该方法      return语句 返回一个值      class  类名:      del _str ...

  2. 实验室外的攻防战 UOJ#180 [树状数组]

    实验室外的攻防战 UOJ#180 [树状数组] 题目 时针指向午夜十二点,约定的日子--2月28日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks\) 博士所在的实验室 ...

  3. 设计模式:装饰者模式介绍及代码示例 && JDK里关于装饰者模式的应用

    0.背景 来看一个项目需求:咖啡订购项目. 咖啡种类有很多:美式.摩卡.意大利浓咖啡: 咖啡加料:牛奶.豆浆.可可. 要求是,扩展新的咖啡种类的时候,能够方便维护,不同种类的咖啡需要快速计算多少钱,客 ...

  4. 不安装证书如何通过模拟器+Fiddler抓包APP的HTTPS请求?

    模拟器抓取https方法 说明:为了解决安卓手线上不能抓取https请求,以下整理通过模拟器抓取https请求方法如下:前置条件:安卓模拟器:夜神抓包工具:Fiddler汉化中文升级版1无需FIDDL ...

  5. java中extends与implements的区别

    学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一 ...

  6. Nginx学习简记_part2

    第4章:nginx配置实例 -反向代理 4.1 反向代理实例一 实现效果:使用 nginx 反向代理,访问 www.123.com 直接跳转到 127.0.0.1:8080 4.1.1 实验代码 1) ...

  7. ajax、反向ajax、jsonp详解

    ajax详解 什么是ajax 其实ajax已经属于老技术了,现在几乎没人不会用了,在这里主要是把底层的东西给大家分享一下,以备应对装逼的面试官. ajax即“Asynchronous Javascri ...

  8. python2-dpkt 下载

    原文链接:https://centos.pkgs.org/7/forensics-x86_64/python2-dpkt-1.9.2-2.el7.noarch.rpm.html .Download c ...

  9. git 生成并添加 SSH key

    git config --global user.name "wangjunqiang" git config --global user.email "wangjunq ...

  10. Logistic回归之有序logistic回归分析

    Logistic回归分析(logit回归)一般可分为3类,分别是二元logistic回归分析.多分类Logistic回归分析和有序Logistic回归分析.logistic回归分析类型如下所示. Lo ...