`

oracle10g 学习笔记上

阅读更多
1.oracle 安装完成后,会默认生成三个用户角色
sys 用户:超级管理员 权限最高 他的角色  dba   密码:chane-on-install  (本人的已经改为pass)
system 用户:是系统管理员 权限也很高 她的角色是 dbaoper  密码:manager  (本人该为pass)
scott 用户:普通用户 密码:tiger  (本人改为woai5jia)

sys 与system
sys 有create database 的权限  而system 没有 其他相似


在日常对oracle管理过程中,使用system 就够了

权限   分为系统权限 和 对象权限;

系统权限:用户对数据库的相关权限
对象权限:用户对其他用户的数据对象操作的权限(比如表,视图,过程。。)
xiaoming 密码:m123;
xiaohong 密码:m1234;

在删除用户时,注意:如果要删除用户,已经创建了表,那么久需要在删除的时候带一个参数 cascade即把该用户及该用户创建的表删除(级联删除)

创建一个用户xiaoming 这个用户是没有任何权限的。比如登录  建表;
这时可以使用system 来赋予它这样的权限
如:grant connect to xiaoming
grant resource to xiaoming
还有比如实现xiaoing 对scott 中表的操作;
这时除了system sys 。scott 可以授权如:
查看emp表 如grant select on emp to xiaoming;


查看/增加/删除/修改 emp表 如grant all on emp to xiaoming;()

scott 收回xiaoming 对emp表的操作;
revoke select on emp from xiaoming:

虽然赋予了xiaoming select的权限 但是在连接xiaoming 后使用select * from emp;还是查询不到
可以使用select * from scott.emp;这里就涉及到了“方案”的概念;scott就是方案名

这里有desc 表名:是查看表结构;

//对权限的维护:如:希望xiaoming 用户可以去查询scott的emp表,还希望
xiaoming 可以把这个权限给别人
----如果是对象权限,就加入with grant option;
grant select on emp to xiaoming with grant option;

?如果scott 把xiaoming的select 权限回收了,那么xiaohong 的权限还在嘛:
答:同时被回收了

使用profile管理用户口令:
profile是口令限制,资源限制的命令集合。数据库建立时;oracle会自动建立名称为default的profile  。当建立用户没有指定profile选项。那么oracle会将defalt分配给用户

(1)账户锁定;
指定该账户登录时最多可以输入密码的次数,也可以指定用户锁定的时间(天),一般用dba 的身份去执行该命令。
如:

sql>create profile lockaaa limit failed_login_attempts 3 password_lock_time 2;
sql>alter user xiaoming profile lockaaa;
(2)给账户解锁
sql>alter user xiaoming account unlock;
(3)终结口令

为了让用户定期的修改密码可以使用终止口令的指令来完成。同样这个命令也需要dba身份来操作

如:给前面的创建的用户xiaoming创建一个profile文件,要求该用户每隔10天
要修改自家登录的密码,宽限期为2天
sql>create profile bbb1 limit password_life_time 10 password_grace_time 2;

sql>alter user xiaoming profile bbb1;


----口令历史
如果希望用户在修改密码时。不能使用以前使用过的密码。可使用口令历史,这样oracle就会将口令修改的信息存放在数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码不一样时。就提示用户重新输入密码、

如:sql>create profile ccc1  limit password_life_time
10 password_grace_time 2 password_reuse_time 10;
//password_reuse_time 指定口令可重用时间即10天后就可以重用
赋给某个用户


删除profile
sql>drop profile ccc[cascade]



-----oracle 表的管理:
1.必须以字母开头
2.数据类型 
a.字符型:char 定长 最大2000字符//如果知道该字段经常被
查询并且是知道大概有多长这样使用char更好,效率更快  如:身份证号
b.varchar2() 变长 最大4000字符
c.clob ()最大字符达4G
3.数字型
number 可以表示整数 也可以表示小数

number(m,n)表示一个小数有m位有效数 n位小数

number(m) 表示一个m位整数
4.日期类型
date  包括年月日时分秒
timestamp 是对date类型的扩展

5 图片 视频等
blob 二进制数据 ,一般我们在数据库中只放视频图片的路径。如果需要安全的
考虑则可以考虑把他们放在数据库中


--建表
create table student(
stuId number(5),
stuName varchar2(10),
sal number(7,2)
);

添加字段
sql>alter table student add(classId number(2));
修改字段
sql>alter table student modify (stuId varchar2(10))
删除字段
sql>alter table student drop column sal;
删除表:
sql>drop table student;
注意:一般我们不做修改字段和删除字段的操作

添加数据
insert into student values(1,'小明','男','01-3月-1997',489.4,12);
在oracle中默认的日期格式是:dd-mm-yy ,月份后要加上“月”
如果要修改默认格式:
SQL> alter session set nls_date_format ='yyyy-MM-dd';
SQL> insert into student values(2,'小红','女','1988-7-6',489.4,12);
插入部分字段:insert into student (xh,xm,sex)values('','','');

空字段的增加和查询------
SQL> insert into student (xh,xm,sex,birthday) values(3,'aa','女',null);

select * from student where birthday is null;

修改一个字段
update student set sal = sal/2 where sex ='男'
修改多个字段;
update student set sex='男',birthday='1999-3-3' where xh = '0A';

删除数据:======
delete from student;//删除所有记录,表结构还在,写日志可以恢复数据,速度慢
一般情况下 我们开始会使用savepoint 保存点名   然后出现错误操作可以使用
rollback to 保存点名   来恢复到原来的位置。在不做处理的情况下,保存点就一个,再赋予一个就会覆盖前面的那个;

drop table student; //删除表的结构和数据

truncate table student;删除表中所有记录。表结构还在 不写日志无法找回删除的记录,但速度很快;

--------//clear 清屏命令;
数据库要求查询效率。所以在数据库中我们常常使用
insert into student (字段1,字段2.。。) select * from student
来实现一个数量巨大的表供我们进行测试;

表单查询------
取消重复行:使用distinct关键字
select 语句中对于传入的内容是区分大小写的;
select ename,joB,sAl from emp where ename ='SMITH';

对于null值的处理;-------
SQL> select ename,13*sal+13*comm,comm from emp;//oracle中规定当某个字段中的值为null时,使用该值计算的结果也为null;

为了避免上上面的发生:可以使用nvl()函数
如:SQL> select ename,13*sal+13*nvl(comm,0) "年薪",comm from emp;
即当comm为null时会使用0代替,不为null 使用本身计算

注意在查询日期的时候,不要忘了oracle本身默认时间的格式:
SQL> select ename,hiredate from emp where hiredate >'3-3月-1983';

group by和having  使用;
//group by 用于对查询的结果分组统计
//having 子句用户限制分组显示结果
SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno;

  MIN(SAL)   AVG(SAL)   MAX(SAL) DEPTNO
---------- ---------- ---------- ------
      1300 2916.66666       5000     10
       800       2175       3000     20
       950 1566.66666       2850     30

-------------------------------------
SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno having avg(sal)>2000;

  MIN(SAL)   AVG(SAL)   MAX(SAL) DEPTNO
---------- ---------- ---------- ------
      1300 2916.66666       5000     10
       800       2175       3000     20

数据分组总结:
1.分组函数只能出现在选择列表 having  order by 子句中。
2.如果在select 语句中同时包含有group by  ,having,order by 那么他们的顺序
一定是group by ,having, order by
如:SQL> select min(sal),avg(sal),max(sal), deptno from emp group by deptno having avg(sal)>2000 order by avg(sal);

  MIN(SAL)   AVG(SAL)   MAX(SAL) DEPTNO
---------- ---------- ---------- ------
       800       2175       3000     20
      1300 2916.66666       5000     10
3.在选择列中如果有列,表达式,和分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则会出错;

多表查询:
1.查询匹配的多列子查询
与simth的工作岗位,部门号都相同的所有员工!
select * from emp where(deptno,job)=(select deptno,job from emp where ename='SMITH');

2.查询比自己部门平均工资高的员工信息。
逻辑要很清晰
i.查询出所有部门的平均工资
select deptno,avg(sal) from emp group by deptno;
在这里我们有一个需要特别注意的就是可以把上面得出的结果看做是一张子表
ii。查询得出结果!
select a1.ename,a1.sal,a2.mysal from emp a1,(select deptno,avg(sal) mysal from emp group by deptno) a2 where a1.deptno=a2.deptno and a1.sal>a2.mysal;

3.接下来讲到oracle中的重点:分页技术,一共有三种方式(见图)
i.rownum分页
(select * from emp)
ii.显示rownum 【注意这里的rownum是oracle分配的,并且只能识别一次】
select a1.*,rownum rn from(select * from emp) a1;
比如查询前十行记录:select a1.*,rownum rn from(select * from emp) a1 where rownum<=10;

但是这样写就会查不出来:
select a1.*,rownum rn from(select * from emp) a1 where rownum<=10 and rownum>=6(原因上面说了,oracle规定rownum 只能在一个条件中使用一次)

如果做过项目的知道。在分页中,我们经常使用到:pageNow pageSize pageCount
rowCount
所以在oracle 中我们也向其他查询一样

把10换成【pageNow*pageSize】
把6换成【((pageNow-1)*pageSize+1)】



所以要完成上面的功能还需要第三次子查询;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO         RN
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
7369 SMITH      CLERK      7902 1980-12-17     800.00               20          1
7499 ALLEN      SALESMAN   7698 1981-2-20     1600.00    300.00     30          2
7521 WARD       SALESMAN   7698 1981-2-22     1250.00    500.00     30          3
7566 JONES      MANAGER    7839 1981-4-2      2975.00               20          4
7654 MARTIN     SALESMAN   7698 1981-9-28     1250.00   1400.00     30          5
7698 BLAKE      MANAGER    7839 1981-5-1      2850.00               30          6
7782 CLARK      MANAGER    7839 1981-6-9      2450.00               10          7
7788 SCOTT      ANALYST    7566 1987-4-19     3000.00               20          8
7839 KING       PRESIDENT       1981-11-17    5000.00               10          9
7844 TURNER     SALESMAN   7698 1981-9-8      1500.00      0.00     30         10

iii.select * from(select a1.*,rownum rn from(select * from emp) a1 where rownum<=10) a1 where rn>=6 ;(注前面前十行查出来了后,rownum字段是rn,所以在第三步中的查询条件要使用rn)
4.几个条件的变化(都是修改最底层的select 子句)
a.需要查询的字段
select * from(select a1.*,rownum rn from(select ename,empno,deptno from emp) a1 where rownum<=10) a1 where rn>=6;

b.排序
select * from(select a1.*,rownum rn from(select ename,empno,sal from emp order by sal) a1 where rownum<=10) a1 where rn>=6;

4.用查询的结果创建一个新表;
create table mytable (id,name,sal) as select empno,ename,sal from emp;

复杂查询:合并查询
有时候,在实际应用中,为了合并多个select语句查询的结果,可以使用集合操作符
union ,  all union,insersect,minus

a.union 该操作符是用于取得两个操作集的并集,使用该操作符会自动去掉结果集中的重复行;
select ename,sal,job from emp where sal>2500 union
select ename,sal,job from emp where job='MANAGER';

b.union all 和上面的union相似,只是不消除重复行【如果能用union all 完成的就不要使用union 这是sql 优化技巧】

c.insersect 指的是取得两个结果集的交集

d.minus 指的是两个集合的差集;

下面介绍几个小技巧:
to_date函数:当插入一个日期时,我们知道oracle默认是:dd-mm月-yyyy;
为了方便插入格式匹配,我们可以是该函数;
当然使用默认插入也是可以自动转化成yyyy-MM-dd的格式
但是还在这里说下该函数的使用方法。
insert into emp values(3,'邓言诚','manager',7782,to_date('1988/2/18','yyyy/MM/dd/'),789,77,10);
我试了一下,yyyy年MM月dd日的格式好像不可以!


一次插入多行记录:
a.上面我提到了一种方法感觉很好
create table mytable (id,name,sal) as select empno,ename,sal from emp;

b.下面的这种方法其实和上面的差不多;
create table mytable1(id number(5),name varchar2(10),job varchar2(20));
先创建后在给表赋值
insert into mytable1(id,name,job) select empno,ename,job from emp where deptno=10;

更新多列数据:
其实上面也有讲过类似的方法:
更新表中SMITH的工资,职位,奖金和SCOTT 一样;
update emp set (sal,job,comm)=(select sal,job,comm from emp where ename='SMITH') where ename='SCOTT';

事务处理:
前面也提到过保存点(savepoint),一般我们在进入数据库操作时,都会设置一个保存点。
a.提交事务,当执行使用commit语句可以提交事务。执行commit语句之后,会确认失事务的变化,结束事务,删除保存点,释放锁。当使用commit语句结束事务后,其他会话将可以查看到事务变化后的新数据。当然不手动的提交事务,使用exit会自动提交,所以建议大家养成手动提交事务的习惯。
那么,我写个小程序,使用java来提交事务(自己导入包,打开服务端口)

package com.demon;
import java.sql.*;
public class TestTransaction {
public static void main(String[] args) {
Connection ct=null;
Statement sm =null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
ct =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","scott","woai5jia");
sm = ct.createStatement();
System.out.println("0...");
//从scott中减去100

//加入事务处理
ct.setAutoCommit(false);
sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");
System.out.println("1...");
int i = 4/0;//当然这里只是举个列子,出现异常有很多种

//从smith中加上100
sm.executeUpdate("update emp set sal=sal-100 where ename='SMITH'");
//提交事务
ct.commit();
sm.close();
ct.close();
} catch (Exception e) {
try {
//出现异常等  回滚事务
ct.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
}
}

b.只读事务;  set transaction read only;
定义不是很好理解,我就用日常事务来说明一下它的用途:比如春节买火车票,售票管理员每隔一段时间就会查看售票情况。假如是每天18:00 统计售票情况,但是在此时,售票还在一直进行,不可能管理员统计就停止售票,所以这时使用只读事务的意义就显现出来了,但管理员在18:00这个时刻设置了只读事务,而售票人员还在进行售票。这时候,管理员查看的只是18:00之前的售票情况。
下面就以oracle自带的 system  和scott 来演示一下:
比如此时system 进入数据库 设置了只读事务:
然后,scott也进入数据库进行数据的操作
操作完成后,scott可以查看到自己操作后的结果,如:scott插入了几个雇员
而system 查找emp 表时却看不到该表被scott操作后的结果;
(select * from scott.emp  注意system查询时使用该形式,因为它要查询的是scott中的emp 表  )

oracle 中sql 函数:
1.字符函数(把emp中的ename 转化成第一个小写剩余字母大写的形式)
select lower(substr(ename,1,1))|| substr(ename,2,length(ename)-1) from emp;
这里我就不多说了,试下就行了,这里的“ || ”是合并两个字符串。
还有很多replace 如:select replace(ename,'A','我是邓言诚') from emp;

2.数学函数
round(n,[m])该函数是四舍五入 m省略则得到整数
trunc(n,[m])截取一个数,省略m 则忽略小数
mod(n,m) 求余;
这里给出一个虚拟表 dual ,用于函数测试;
如:SQL> select mod(10,2) from dual;

MOD(10,2)
----------
         0
--------------------------------------------------
floor(m),得到一个比m小的最大整数 如:floor(33.3)--->33
ceil(m),得到一个比m大的最小整数 如:ceil(44.2)--->45
还有其他数学函数 abs(),sin(),cos() power()......

3.日期函数
a.当期日期
SQL> select sysdate from dual;

SYSDATE
-----------
2011-6-19 0

b.addmouths(d,n);指d 加上n个月后的日期
如:得出从受雇距今超过30年的员工信息
select * from emp where sysdate>add_months(hiredate,30*12);

c.在oracle中可以利用时间想减得到天数:但因为小时的关系,可以忽略
select floor(sysdate-hiredate),ename from emp;

d.last_day(d);得到这个日期下,该月的最后一天。
SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDATE)
-----------------
2011-6-30 0:17:57

如:各月倒数第3天入职的员工信息;
select * from emp where hiredate=last_day(hiredate)-2;

4.转换函数
虽然oracle中有自动转化功能,但有时候有的还是需要进行转化;
这里我说下to_char();该函数功能很广泛,可用于日期也可以用于薪水;

insert into emp values(100,'邓言诚','MANAGER',7566,sysdate,3232,324,10);
然后查询:SQL> select ename,to_char(hiredate,'yyyy-MM-dd HH24:mi:ss') "入职时间",to_char(sal,'L99,999.99') "薪资" from emp where empno=100;

ENAME      入职时间            薪资
---------- ------------------- --------------------
邓言诚     2011-06-19 00:44:01           ¥3,232.00

这里注意下:当使用别名时,使用中文要使用“”括起来,''不行。
就查询语句中的日期格式我就不说了,我来说下薪资的格式
L ---》表示当地的货币类型;
99,999.99---》小数点前表示整数,小数点后表示小数。至于前面的<,> 大家取钱都见过这种格式吧!还有就是数据要根据你创建表示的格式而定,如该emp表:sal number(7,2);
如果要使用国际货币则使用“$”....(把L换成相应的国际货币符号就可以了)

5.系统函数
a.terminal:当前会话客户所对应的终端的标示符
b.language :语言
c.db_name:当前数据库名称
d.nls_date_format;当前会话客户对应的日期格式
e.session_user:会话客户所对应的数据库用户名
f.current_schema:当前会话客户对应的默认方案名?
g.host:返回数据库所在主句名称
select sys_context('userenv','db_name') from dual;这里的userenv是用户所处环境

数据库管理员:
1.管理数据库的用户主要是sys 和system,他们的主要区别是:
(1)最重要的区别:存储的数据的重要性不同。
sys:所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行至关重要。由数据库自己维护,任何用户都不能手动更改。sys用户拥有dba,sysdba,sysoper角色或权限,是oracle权限最高的用户。
system:用于存放次级的内部数据;如oracle的一些特性或工具管理信息。system用户拥有dba,sysdab角色或系统权限。
(2)其次区别:权限不同。
sys用户必须以as sysdba 或as syspoer形式登陆,不能以normal方式登陆数据库
system如果正常登陆。它其实就是一个普通的dba用户,但是如果以as sysdba登陆,其结果实际上它是作为sys用户登录的。(见附图)

2.数据库的逻辑备份(到出)和恢复(导入)【注意在导入和导出要在oracle安装目录的BIN 下进行】
导出表:

a.导出自己的表:(见附图)
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp1.dmp

b.导出其他方案的表:在这个提下方案,一个用户的创建就会生成对应一个和用户名相同的方案;
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=system/pass@ORCL tables=(scott.emp) fi
le=d:\emp2.dmp

c.导出表结构
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp3.dmp rows=n

d.直接导出方式,这种方式导入速度快,当数据量很大的时候可以考虑使用该方式
E:\oracle\product\10.1.0\Db_1\BIN>exp userid=scott/woai5jia@ORCL tables=(emp) fi
le=d:\emp4.dmp direct=y

导出方案:
a.导出自己方案
exp userid=scott/woai5jia@ORCL owner=scott file=d:\emp5.dmp

b.导出其他方案
exp userid=system/pass@ORCL owner=(system,scott) file=d:\emp6.dmp[这里表示用system用户导出自己的方案并导出scott方案]

导出数据库:【要求该用户具有dba权限或是exp_full_datebase权限】
exp userid=scott/woai5jia@ORCL full=y inctype=complete file=d:\emp7.dmp(inctype 表示增量备份)

导入表 和上面的对应

a.导入自己的表
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\emp.dmp;

b.导入表到其他用户
imp userid=system/pass@ORCL tables=(emp) file=d:\xx.dmp touser=scott;

c.导入表结构,只导入结构不导入数据
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\emp1.dmp rows=n;

d.导入数据:如果对象(如表)已经存在,则只导入数据
imp userid=scott/woai5jia@ORCL tables=(emp) file=d:\xxx.dmp ignore=y;

导入方案:
a.导入自身方案
imp userid=scott/woai5jia@ORCL file=d:\emp4.dmp;

b.导入其他方案【还是需要拥有dba身份】
imp userid=system/pass@ORCL file=d:\emp4.dmp fromuser=system touser=scott;

导入数据库
imp userid=system/pass full=y  file=d:\xxxx.dmp;

--------------------------------------------------------------------------
* 注意以上的导入导出要对应相应的.dmp 我在这里只是把功能列出来,没有具体对应。应为我当时建的时候
没有标记dmp所对应的表
------------------------------------------------------------------------

前面介绍了当创建一个用户就会生成一个与之名称相对应得方案,其中方案中就包含下面的数据字典和动态性能视图。。。。。

数据字典 和动态性能视图
数据字典:在oracle中提供了数据库的一些系统信息,是静态的数据
动态性能视图: 记载了例程启动后的相关信息,是动态数据

数据字典视图:

(1)user_tables;用于显示当前用户所拥有的所有表,它只返回所对应方案的所有表
select table_name from user_tables;

(2)all_tables :用于显示当前用户可以访问的所有表,不仅返回当前用户方案表,还可以返回当前用户可以访问的其他方案表 select table_name from all_tables;

(3)  dba_tables 它显示所有方案所有的数据库表,但是查询这种数据库字典

视图。要求用户必须是dba角色或是select any table 系统权限

SQL> conn system/pass;
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as system

SQL> select table_name from dba_tables;

重要查询:
//通过dba_users可以显示所有数据库用户的消息信息
select username,password from dba_users;

//通过查询数据字典视图dba_sys_privs,可以显示用户所具有的系统权限
SQL> desc dba_role_privs;
Name         Type         Nullable Default Comments                                         
------------ ------------ -------- ------- -------------------------------------------------
GRANTEE      VARCHAR2(30) Y                Grantee Name, User or Role receiving the grant   
GRANTED_ROLE VARCHAR2(30)                  Granted role name                                
ADMIN_OPTION VARCHAR2(3)  Y                Grant was with the ADMIN option                  
DEFAULT_ROLE VARCHAR2(3)  Y                Role is designated as a DEFAULT ROLE for the user

SQL> select * from dba_role_privs where GRANTEE='SCOTT';

GRANTEE                        GRANTED_ROLE                   ADMIN_OPTION DEFAULT_ROLE
------------------------------ ------------------------------ ------------ ------------
SCOTT                          CONNECT                        NO           YES
SCOTT                          RESOURCE                       NO           YES

//通过查询数据库字典dba_role_privs 可以显示用户所具有的角色
select * from dba_role_privs;

//如何查询一个角色包括的权限?
a.一个角色包含系统权限
select * from dba_sys_privs where grantee= 'CONNECT';
另外也可这样查看
SQL> conn system/pass as sysdba;
Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0
Connected as SYS

SQL> select * from role_sys_privs where role='CONNECT';

ROLE                           PRIVILEGE                                ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
CONNECT                        CREATE VIEW                              NO
CONNECT                        CREATE TABLE                             NO
CONNECT                        ALTER SESSION                            NO
CONNECT                        CREATE CLUSTER                           NO
CONNECT                        CREATE SESSION                           NO
CONNECT                        CREATE SYNONYM                           NO
CONNECT                        CREATE SEQUENCE                          NO
CONNECT                        CREATE DATABASE LINK                     NO

b.一个角色包含的对象权限
select * from dba_tab_privs where grantee='CONNECT';

//查询某个用户具有怎样的角色
select * from dba_role_privs where grantee='SCOTT';

//查询oracle中所有的系统权限。一般是dba
select * from system_privilege_map order by name;

//查询oracle中所有的角色,一般是dba
select * from dba_roles;

//查询oracle中所有对象权限,一般是dba
select distinct privilege from dba_tab_privs;

//查询数据库的表空间
select tablespace_name from dba_tablespaces;

//查看当前数据库
SQL> select * from global_name;

GLOBAL_NAME
--------------------------------------------------------------------------------
ORCL

下面总结下:一个用户拥有多个角色,一个角色是多个权限的集合;


管理表空间和数据文件*****
表空间是数据库的逻辑组成部分,从物理上讲,数据库数据(如表等)存放在数据文件中,从逻辑上讲,数据库则是存放在表空间中,表空间由一个或多个数据文件组成(见附图),所以我们通过操作表空间来操作表文件!
表空间:表空间用于逻辑上组织数据库的数据,数据库逻辑上是有一个或是多个表空间组成。通过表空间可以达到以下作用a.控制数据库占用的磁盘空间b.dba 可以将不同数据类型部署到不同的位置,这样有利于提高I/O性能,同时利于备份和恢复等管理操作。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics