Highlight
5.4.孤单芭蕾.我回避.你继续~! 6.18.答辩; Welcome to Paul's technical space!
随笔-6  评论-0  文章-0  trackbacks-0

用过Oracle,再比较曾经用过的Access和MySQL,才深刻体会到Oracle在数据存储和管理方面的强大!个人觉得Oracle比较突出的特点有:

1、数据的存储方式和查询效率;
2、用户的权限管理;

下面是我在使用Oracle过程中在网上找的一些资料,并附上一些自己的心得体会。需要指出的一点是,作为刚从小型数据库转到使用大型数据库的Oracle初学者,我觉得很有必要熟练掌握视图的操作!!在本文最后会展开论述一下我对视图的理解。


一、概念

 1. 数据库 (Database)

什么是数据库?

数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。这种数据集合具有如下特点:尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增、删、改和检索由统一软件进行管理和控制。从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。

什么是数据库系统?

数据库系统是一个实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。它通常由软件、数据库和数据管理员组成。其软件主要包括操作系统、各种宿主语言、实用程序以及数据库管理系统。数据库由数据库管理系统统一管理,数据的插入、修改和检索均要通过数据库管理系统进行。数据管理员负责创建、监控和维护整个数据库,使数据能被任何有权使用的人有效使用。数据库管理员一般是由业务水平较高、资历较深的人员担任。
打个比喻吧:库据库就是存放数据的仓库. 当然仓库得组织得有序,这需要一套管理方法及管理组织,管理方法及管理组织结合就成了一个管理仓库的有机体——系统。

2. 数据表空间 (Tablespace)
存放数据总是需要空间, Oracle把一个数据库按功能划分若干空间来保存数据。当然数据存放在磁盘最终是以文件形式,所以一盘一个数据表空间包含一个以上的物理文件。

3. Oracle用户
一个数据库多个用户来创建和管理自己的数据, 每个用户有自己的权限,也可与其他用户共享数据。

4. 数据表
在仓库,我们可能有多间房子,每个房子又有多个货架,每架又有多层。 我们在数据库中存放数据,最终是数据表的单元来存储与管理的。

5. 数据文件
以上几个概念都是逻辑上的, 而数据文件则是物理上的。就是说,数据文件是真正“看得着的东西”,它在磁盘上以一个真实的文件体现。

二、创建

1. 数据库

安装好oracle后,一个数据库系统就安装好了,其中有一个缺省的数据库,当然,还可以创建新的数据库。

2. 数据表空间

现在应该建数据表空间,就如要存放货物,起码首先得把房子建好吧。就是存放东西的空间。表空间就存放数据的空间。

格式: create tablespace 表空间名 datafile '数据文件名' size 表空间大小;

例子:
create tablespace data_test datafile 'e:\oracle\oradata\test\data_1.dbf' size 2000M;
create tablespace idx_test datafile 'e:\oracle\oradata\test\idx_1.dbf' size 2000M;
(*数据文件名 包含全路径, 表空间大小 2000M 表是 2000兆)

3.用户

建好tablespace, 就可以建用户了

格式:create user 用户名 identified by 密码 default tablespace 表空间表;

例子:
create user study identified by study default tablespace data_test;
(*创建一个用户名为 study,密码为 study, 缺少表空间为 data_test -这是在第二步建好的.)
(*抽省表空间表示 用户study今后的数据如果没有专门指出,其数据就保存在 data_test中, 也就是保存在对应的物理文件 e:\oracle\oradata\test\data_1.dbf中)

4. 授权给新用户

grant connect,resource to study;
--表示把 connect,resource权限授予study用户
grant dba to study;
--表示把 dba权限授予给 study

5. 创建数据表

进入刚创建的用户:
sqlplusw study/study@test

然后就可以在用户study中创建数据表了:

格式:create table 数据表名,后面的详细参数,在网上搜索 "oracle" "create table" "语法"。

例子:
create table test_user (
no number(5) not null , --pk
username varchar2(30) not null , --用户名
passpord varchar2(30) not null , --密码
constraint pk_connectdb primary key(no)
)storage (initial 10k next 10k pctincrease 0);

*下面讲解上面命令的各方面的含义
create table test_user --创建数据表
no number(5) not null , --pk
(列名或字段名) 数据类型(数据长度)
该数据列不能为空 ,是列之间的分隔符 --后的内容是注释

constraint pk_connectdb primary key(no)
(约束) 约束名 (主键) (列名)
值得一提的是,Oracle中可以对多个列定义主键约束,约束条件为(非空、不重复),即多个列合并起来的ID不重复即可,利用这点可以很方便地定义父表系统和子表系统。

storage (initial 10k next 10k pctincrease 0);
Oracle的一种存储管理方式,初次接触,深刻体会到Oracle在数据存储管理方面的专业。如果某个数据表要存放大量数据,就把initial和next后的值设置大一点, 否则设置小一点。

既然上面在创建数据表中没有特别指定 表空间,当然该表就存放在study缺省表空间data_test了.

三、管理

1.用户管理

(1)修改用户
ALTER USER avyrros
IDENTIFIED EXTERNALLY
DEFAULT TABLESPACE data_ts
TEMPORARY TABLESPACE temp_ts
QUOTA 100M ON data_ts
QUOTA 0 ON test_ts
PROFILE clerk;

(2)删除用户
DROP USER username [CASCADE]
CASECADE 选项会删除该用户模式下的所有对象,建议在删除前,先确认是否有其他的依赖关系存在。

(3)用户权限查询
a、查询某个用户授予其他用户在当前用户模式下的对象权限
   select * from user_tab_privs_made --假如当前用户为WENZI,那么查询结果就是由WENZI授权,在WENZI模式下的权限记录

b、查询某个用户授予其他用户在该用户模式对象及其他模式对象上的对象权限
   select * from all_tab_privs_made -- 假如当前登录用户为WENZI,那么查询结果就是所有由WENZI授予的权限的记录

c、查询为某个用户授予的,在其他模式对象上的权限
   select * from user_tab_privs_recd --假如当前登录用户为WENZI,那么查询结果就是WENZI在其他模式对象上的权限

d、查询为某个用户授予的,在该用户模式对象与其他模式对象上的权限
   select * from all_tab_privs_recd --假如当前用户为wenzi,则查询结果为wenzi在整个数据库中拥有权限的对象

e、查询属于用户的对象
   select owner,object_name,object_type,status from dba_objects where owner='WENZI'

2.角色管理

(1)创建口令文件
orapwd file='..........\pwd{SID}.ora' password='***(sys的密码)' tntries=10(口令文件最大的用户数量)

(2)授予权限
要使某个用户可以使用口令文件,必须为其授予SYSDBA权限,系统会自动将其加入到口令文件中。
grant sysdba to wenzi
当收回SYSDBA权限时,系统将对应的用户从口令文件中删除。
revoke sysdba from wenzi

(3)查看口令文件管理的用户
select * from v$pwfile_users

四、备份

为防止数据出现意外损坏和丢失,需要定期对数据库进行备份,备份方法如下:


1.表的复制

(1) 复制表结构及其数据:
create table table_name_new as select * from table_name_old

(2)只复制表结构:
create table table_name_new as select * from table_name_old where 1=2;
或者:
create table table_name_new like table_name_old

(3)只复制表数据:
如果两个表结构一样:
insert into table_name_new select * from table_name_old
如果两个表结构不一样:
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

(4)添加约束条件
复制表没有主键,因此需要进一步添加主键。添加约束的指令格式为:
alter table 表格名称 add constraint 约束名称 增加的约束类型 (字段列表)
例子:
alter table emp add constraint ppp primary key (id1,id2,id3)
以上代码,联合三个列为主键,列名为id1,id2,id3,表名为emp,约束名为ppp。在数据库所有表中约束名需保证唯一性,因此一般采用某种序列生成方式来形成约束名。

2.数据库备份

(1)导出
exp ff/ff@orcl file='d:ff.dmp' tables=customers direct=y
使用exp 输出。输入的为需要备份的用户表的账号和密码,根据提示一直点回车就OK 结束后将会出现一个ff.DMP文件,此文件为备份数据。
导出时可以选择导出:1.整个数据库(需具备dba权限);2.用户(包括表、视图和其它);3.表(只包含表,不导出视图);

(2)导入
create user ly identified by pw default tablespace users quota 10M on users;
创建新用户 用户名为ly 密码为pw 默认表空间为此空间,配额为10M
grant connect,resource,dba to ly;
赋予ly权限(1.连接;2.资源;3.dba权限,必须具备才能执行导入!)
grant create session,create table,create view,unlimited tablespaces to ly;
赋予ly其它常用权限(1.登陆到服务器,2.创建表,3.创建视图,4.无限表空间)
imp ly/ly@ORCL fromuser=ff touser=ly file='d:ff.dmp' constraints=n
使用 imp 输入。输入需要导入的用户的用户名和密码 然后点回车,根据提示一直到再次要求你输入用户名的地方。

(3)DBA授权问题
一个数据库中除了system和sys用户以外,最好严格控制DBA权限的授予,尤其是不要随便赋予应用系统schema的owner以这个权限。
目前国内的软件开发以及项目管理的能力还很薄弱,绝大多数项目中,不会设立专门的数据库管理角色,又为了图方便,往往赋予应用系统schema的owner以DBA权限,这样一来,在一个几十人或者上百人的团队中,其中任何一个开发人员或是运维人员一个随意的对DB的操作,对DB而言也许将会是灾难性的。
因此,当导入数据后,应及时revoke掉 DBA 权限。

(4)数据存放的表空间问题(IMP由拥有DBA权限的用户EXP数据时)
第一种情况:
目标数据库中存在与导出用户的缺省表空间同名的表空间,此时,一定要将导入用户的 unlimited tablespace 权限 revoke 掉,否则,数据将全部被导入到那个同名的表空间中,而不是导入用户的缺省表空间中。

第二种情况:
目标数据库中没有与导出用户的缺省表空间同名的表空间,这种情况下,并不需要将导入用户的 unlimited tablespace 权限 revoke 掉。

总结:
当拿到由拥有DBA权限的用户导出的数据时,最好问清楚其缺省表空间,如果目标数据库中存在与导出数据库同名的表空间时,这种情况需要特别注意。
我们往往在一看到“IMP-00013: 只有 DBA 才能导入由其它 DBA 导出的文件” 这个错误信息后,就立刻给导入用户授予DBA权限,但却忽略了DBA的角色是拥有对数据库中所有表空间unlimit的权限,造成花费很长时间import结束后,却发现没有导入到预期的表空间中。
简而言之,如果有同名表空间存在的话,必须将导入用户的 unlimited tablespace的权限 revoke 掉,否则数据将被直接存放到了那个同名表空间中,而不是导入用户缺省的表空间中;如果没有同名表空间,则无需进行 revoke,oracle 会自动将数据存放在导入用户的缺省表空间中。

五、关于视图

现在迷上了使用视图来查询,主要是因为视图有以下几点很突出的作用,而这些作用单纯的表是无法实现的。

1.视图的作用

(1)简化用户的操作。
联接表,对用户隐蔽,并使用户能以多种角度查看同一数据。

(2)逻辑独立性。
可以利用视图导出同一表的不同内容,实现多个独立的“虚拟表”。

(3)提高数据的安全性。
封装了部分操作,隐蔽了内部表结构。

2.视图的创建

create or replace view 视图名 as 条件;



金钱,可以给路边的陌生人,而时间,只愿意留给我在乎的人。
专注SOA、ESB,专注通信、教育领域数据交换。
MSN:java.paul@hotmail.com
Email:javapaul@163.com
posted on 2010-05-12 14:19 JavaPaul 阅读(1643) 评论(0)  编辑  收藏 所属分类: 数据库相关

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问