理清oracle中数据库、用户、方案、表空间、表对象之间的关系

原文http://blog.csdn.net/nkliming/article/details/7613189

1.首先是ORACLE的整体结构。
oracle中的一个数据库就是一个实例.
oracle的一个用户就是一个Schema(即方案).
oracle的结构是===
          实例->用户->表(用户属于数据库实例,表属于某个用户)

所以在oracle下建立 建表空间,建用户,设置用户的默认表空间,在用户下建表;
复制代码
 

--创建数据表空间
create tablespace CICI
logging
datafile 'D:\oraclexe\app\oracle\oradata\CICI\CICI.DBF'
size 32m
autoextend on
next 32m maxsize 2048m
extent management local;

--创建用户并指定表空间

CREATE USER cici IDENTIFIED BY cici
PROFILE DEFAULT
DEFAULT TABLESPACE CICI  
ACCOUNT UNLOCK;
-- 为用户赋予权限
GRANT connect, resource TO cici;
grant create session to cici;
-- 登录用户
sql>conn
请输入用户名 cici
请输入密码 XXXXXX
---建立表
create table A(name varchar2(100) primary key);
-- 查询表
select * from cici.A;
复制代码
  2.现在我们再看看表空间和方案之间的关系吧。

  在一个instance下可以有多个用户,每个用户只能有一个schema.但是表空间和schema之间没有关系.

schema生成的条件:在数据库创建一个用户后,并给以这个用户创建表或者其他对象的权限,这时还没有shcema存在。只有当这个用户利用这些权限创建了属于自己的第一个对象时,oracle为这个用户创建一个schema,来容纳这个对象以及以后创建的对象。

DB建立好以后,实际上oracle是一个一个的DBF文件,然后N个DBF文件组成一个表空间:
一个数据库叫cici,
cici下用户使用的表空间有3个: u1, u2, u3
其中
u1由d:\1.dbf组成
u2由d:\11.dbf d:\22.dbf组成
u3由 d:\33.dbf组成
同一个schema的objects可以存储在不同的tablespace(表空间)中 

同样,一个tablespace也可以存储不同schema的objects。
schema就是一个用户和它下面的所有对象,而表空间逻辑上用来放objects,物理上对应磁盘上的数据文件或者裸设备。
3.再看方案和用户之间的关系吧。
方案为数据库对象的集合,方案的名称为用户的名称。 
schema里面包含了各种对象如tables,views,sequences,stored procedures,synonyms,indexes,clusters,and database links。
 
oracle数据库中不能新创建一个schema,
要想创建一个schema,只能通过创建一个用户的方法解决(oracle中的create schema语句不是用来创建schema的)。schema的个数通user的个数相同,
 
在授权情况下,一个用户可以使用其他的schema,一个用户只有一个缺省的schema。
如果我们访问一个表时,没有指明该表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的sheman名。
比如我们在访问数据库时,访问scott用户下的emp表,通过select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。 
我们需要在创建对象时指定该对象的表空间。
oracle中的schema就是指一个用户下所有对象的集合,schema本身不能理解成一个对象,oracle并没有提供创建schema的语法,schema也并不是在创建user时就创建,而是在该用户下创建第一个对象之后schema也随之产生,只要user下存在对象,schema就一定存在,user下如果不存在对象,schema也不存在;这一点类似于temp tablespace group,另外也可以通过oem来观察,如果创建一个新用户,该用户下如果没有对象则schema不存在,如果创建一个对象则和用户同名的schema也随之产生。
下面是一些例子SQL> Gruant dba to scott
SQL> create table test(name char(10));
Table created.
SQL> create table system.test(name char(10));
Table created.
SQL> insert into test values('scott');
1 row created.
SQL> insert into system.test values('system');
1 row created.
SQL> commit;
Commit complete.
SQL> conn system/manager
Connected.
SQL> select * from test;
NAME
----------
system
SQL> ALTER SESSION SET CURRENT_SCHEMA = scott; --改变用户缺省schema名
Session altered.
SQL> select * from test;
NAME
----------
scott
SQL> select owner ,table_name from dba_tables where table_name=upper('test');
OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT TEST
SYSTEM TEST
最后,让我们再来总结一下:
数据库是一个大圈,里面圈的是表空间,表空间里面是数据文件,schema是一个逻辑概念,是一个集合,但schema不是一个对象,
oracle也并没有提供创建schema的语法。表空间也是个逻辑概念,本质上是一个或者多个数据文件的集合。
数据文件是一个物理概念,是具体存储数据的物理文件。
一个数据文件只能属于一个表空间,一个表空间可以包含一个或多个数据文件,一个数据库由多个表空间组成,但是一个表空间只能属于一个数据库。
下面有个很形象的比喻,是从网上摘的,不妨一看:
我们可以把database看做是一个大仓库,仓库分了很多很多的房间,schema就是其中的房间,一个schema代表一个房间,table可以看做是每个schema中的床,
table被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了,
然后床上可以放置很多物品,就好比table上可以放置很多列和行一样,
数据库中存储数据的基本单元是table,显示中每个仓库放置物品的基本单位就是床,user就是每个schema的主人,
(所以schema包含的是object,而不是user),user和schema是一一对应的,每个user在没有特别指定下只能使用自己schema的东西,
如果一个user想使用其他schema的东西,爱就要看哪个schema的user有没有给你这个权限了,
或者看这个仓库的老大(DBA)有没有给你这个权限了。换句话说,如果你是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是你的,
你有完全的操作权,可以扔掉不用东西从每个房间,也可以防止一些有用的东西到某个房间,你还可以给每个user分配具体的权限,也就是他到某一个房间能做些什么,
是只能看(read-only),还是可以像主人一样有所有控制权(R/W),这个就要看这个user所对应的角色Role了。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值