?
ps:这是我在别的网站下下载的,看到人家写的特别好,因为不是百度空间,也没法转载,所以以这样的方式和大家分享。
?
?
oracle中的数据库、用户、方案、表空间、表对象之间的关系
????最近在学习oracle,给我的第一个感觉就是甲骨文的体系太庞大了(因为我之前一直使用的是mysql,轻量级的数据库)。而开始遇到的最纠结的问题,就是怎么理清oracle中数据库、用户、方案、表空间、表对象之间的关系,如果这个问题搞不清楚,接下来的学习也就会雨里雾里了。所以,下定决心一定把它研究清楚,便开始了搜索各种资料的旅程。
1.首先,我们先看看oracle和sqlserver的一些区别吧。oracle中的一个数据库就是一个实例,而在sqlserver中,在一个实例下面可以建多个数据库。从用户方面来看,oracle的一个用户就是一个Schema(方案,虽然这么说不太准确,但是易于理解,后面我会详细说明这个问题),所有的表都属于不同的用户,一个用户要访问另一个用户的表,需要有授权,而在sqlserver中,表是在数据库中创建的,它并不属于某个用户。oracle的结构是===实例->用户->表,表是属于某个用户的(但是访问时实际上用的是schema进行索引表的)所以在oracle下?建表空间,建用户,设置用户的默认表空间,在用户下建表;而在sqlserver下,结构是===实例->库->表,用户与库、表?独立,sqlserver下是建库,在库下建表,建用户,设置用户访问库的权限。《也可以这么理解,oracle中有数据库,但是不同于sqlserver,oracle的一个实例只有一个数据库,数据库系统的基本信息也保存在这个数据库中,不像sqlserver保存在单独的master数据库中》
2.现在我们再看看表空间和方案之间的关系吧。其实它们之间的关系就是没有关系,在一个instance下可以有多个用户,每个用户只能有一个schema。很多人包括我一直在想的问题就是既然schema是用来存放table?object的,而表空间也是存放table?object,它们之间是不是存在着某种关系呢,但是结果就是没有关系。在数据库创建一个用户后,并给以这个用户创建表或者其他对象的权限,这时还没有模式存在。只有当这个用户利用这些权限创建了属于自己的第一个对象时,oracle为这个用户创建一个schema,来容纳这个对象以及以后创建的对象。同一个schema的objects可以存储在不同的tablespace(表空间)中,同样,tablespace也可以存储不同schema的objects。schema就是一个用户和它下面的所有对象,而表空间逻辑上用来放objects,物理上对应磁盘上的数据文件或者裸设备。
3.再看方案和用户之间的关系吧。从定义中,我们可以看出方案为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字也就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个schema,schema里面包含了各种对象如tables,views,sequences,stored?procedures,synonyms,indexes,clusters,and?database?links。一个用户一般对应一个schema,该用户的schema名等于用户名,并作为该用户缺省的schema,这就是我们在企业管理器的方案下看到的schema名都是数据库用户名的原因。oracle数据库中不能新创建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决(oracle中的create?schema语句不是用来创建schema的)。schema的个数通user的个数相同,而且schema名字和user名字一一对应并且相同,所以我们称schema为user的别名,虽然不准确,但是容易理解。在授权情况下,一个用户可以使用其他的schema,一个用户只有一个缺省的schema。如果我们访问一个表时,没有指明该表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的sheman名。比如我们在访问数据库时,访问scott用户下的emp表,通过select?*?from?emp;?其实,这sql语句的完整写法为select?*?from?scott.emp。在数据库中一个对象的完整名称为schema.object,而不属user.object。类似如果我们在创建对象时不指定该对象的schema,在该对象的schema为用户的缺省schema。这就像一个用户有一个缺省的表空间,但是该用户还可以使用其他的表空间,如果我们在创建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。
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的语法。表空间也是个逻辑概念,本质上是一个或者多个数据文件的集合。数据文件是一个物理概念,是具体存储数据的物理文件。一个数据文件只能属于一个表空间,一个表空间可以包含一个或多个数据文件,一个数据库由多个表空间组成,但是一个表空间只能属于一个数