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

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. 复习 Array,重学 JavaScript

    1 数组与对象 在 JavaScript 中,一个对象的键只能有两种类型:string 和 symbol.下文只考虑键为字符串的情况. 1.1 创建对象 在创建对象时,若对象的键为数字,或者由 字母+ ...

  2. 编译hotspot8

    编译hotspot8 ubuntu desktop 18 全新准备与编译过程再记录下: # 建议使用此gcc和g++版本,过高版本比如gcc7或引发编译报错 sudo apt-get install ...

  3. 只要动手就能学到东西4 JSON.stringify

    今天在调试javascript时,需要将不可显示字符如\r\n在console显示出来,查了下,原来可以用JSON.stringify().这个方法以前也用过,但都是将javascript对象变成js ...

  4. 第3章 SparkSQL解析

    第3章 SparkSQL解析 3.1 新的起始点SparkSession 在老的版本中,SparkSQL提供两种SQL查询起始点,一个叫SQLContext,用于Spark自己提供的SQL查询,一个叫 ...

  5. Federated Machine Learning: Concept and Applications

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Qiang Yang, Yang Liu, Tianjian Chen, and Yongxin Tong. 2019. Federate ...

  6. KNN手写数字识别

    import numpy as np import matplotlib .pyplot as plt from sklearn.neighbors import KNeighborsClassifi ...

  7. yield 的使用

    yield 在很多高级语言都有,比如:python.scala.JavaScript.Ruby等. 我们实际工作时,很少会用到yield,但是也架不住求职面试的时候,面试官可能会问呀. yield 在 ...

  8. webgl实现径向模糊

    径向模糊简介 径向模糊,是一种从中心向外呈幅射状,逐渐模糊的效果. 因此径向模糊经常会产生一些中心的发散效果,在PS中同样也有径向模糊的滤镜效果. 径向模糊通常也称为变焦模糊.径向模糊(Radial ...

  9. css基本样式设置

    div中文字居中 如何让一个div中的文字水平和垂直居中?设置如下: 给定该div的长宽(或者二者只给出其一也可) .box{ height: 100px; width: 30%; text-alig ...

  10. Fiddler扩展——导出Jmeter脚本

    前言 Fiddler,对于大家而言,应该早已耳熟能详,是个抓包神器,具体的使用,我就不多说了.如果对Fiddler的使用还不太熟练,可以翻看我以前一系列的博文.我罗列出来,方便大家阅读,如下所示: 1 ...