最近在学习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的语法。表空间也是个逻辑概念,本质上是一个或者多个数据文件的集合。数据文件是一个物理概念,是具体存储数据的物理文件。一个数据文件只能属于一个表空间,一个表空间可以包含一个或多个数据文件,一个数据库由多个表空间组成,但是一个表空间只能属于一个数据库。
下面有个很形象的比喻,是从网上摘的,不妨一看:
我们可以把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了。
ps:到此,这个问题基本上算是理清了,小弟刚接触oracle,文章中有不足或者纰漏之处,还请高手耐心指导,谢谢!
分享到:
相关推荐
1. Oracle数据库的基本概念:Oracle数据库是一种对象关系型数据库管理系统,它能够将大量数据存储在计算机存储设备中,并可以实现对数据的高效访问。它使用结构化查询语言(SQL)作为数据查询的主要语言,并提供了一...
Oracle数据库表空间设计管理方法是一篇专门介绍Oracle数据库中如何进行表空间设计与管理的文章,涵盖了数据库结构、设计原则以及表空间问题解决方法等重要知识点。为了更好地理解和运用这些知识点,我们将从以下几个...
9. 了解 Oracle 数据库迁移的应用场景:本教程中提供了两个应用场景,分别是实现不同库下不同用户之间表空间的迁移和实现不同表空间中表的迁移。 通过本教程,我们可以学习如何快速迁移 Oracle 数据库,以实现稳定...
它连接Oracle数据库,自动扫描并提取其结构或数据,然后生成可以加载到PostgreSQL数据库中的SQL脚本。 二、Ora2PG功能 Ora2PG可以支持大多数SQL的转换,但某些情况下仍需要人工校正语法,使其兼容PostgreSQL。其...
在Oracle数据库管理中,经常会出现因表空间不一致而导致的数据导入失败的问题。本文将详细介绍如何解决这一常见问题,并确保数据能够顺利地从一个环境迁移到另一个环境中。 #### 一、问题背景 在进行Oracle数据...
### Oracle数据库日常维护方案知识点详解 #### 一、项目背景及目标 - **项目背景**:随着企业信息化建设的不断推进和发展,当前已有成熟稳定的网络环境以及覆盖生产经营管理的多种应用系统。面对超过600台在线运行...
表空间是Oracle数据库中数据组织的主要逻辑单元,它充当了数据库对象的容器。在逻辑上,一个数据库由一个或多个表空间组成,每个表空间可以包含多个段。表空间下还可以进一步分为段、区和块。表空间允许数据库管理...
以上语句创建了一个名为SM71INDEX的表空间,用于存储用户的对象。然后,可以创建其他必要的表空间、用户、角色和权限,以及设置相应的初始化参数。 总之,Oracle创建数据库涉及多个层面,包括数据库设计、存储策略...
Oracle9i是一款强大的关系型数据库管理系统,其在21世纪初发布,提供了众多先进的功能,以满足企业级数据存储和管理的需求。...理解和掌握这些知识点对于任何Oracle数据库管理员来说都是至关重要的。
### ORACLE数据库优化设计方案 #### 一、数据库优化自由结构OFA(Optimal Flexible Architecture) 在Oracle数据库的设计中,逻辑配置对于性能具有重要的影响。Oracle推荐了一种优化结构——OFA(Optimal Flexible ...
Oracle数据库管理是计算机科学中数据库管理系统领域的重要分支。...通过Oracle数据库管理教程的学习,数据库管理员可以获得数据库设计、管理、备份与恢复等方面的全方位知识,为日常工作中遇到的各种问题提供解决方案。
【数据库字典】在Oracle数据库中,数据库字典是一组系统表和视图,用于存储关于数据库对象(如表、索引、用户、权限等)的信息。通过查询数据库字典,可以获取元数据,帮助理解和管理数据库结构。 【解决方案设计】...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,尤其在企业级应用中占据重要地位。本教程针对初学者,深入浅出地介绍了Oracle的核心概念、功能和操作,旨在帮助学习者快速掌握这一强大的数据库系统。 首先...
表空间是 Oracle 数据库中的一个主要结构,用于存储数据库对象。模式对象是 Oracle 数据库中的数据库对象的集合,包括表、视图、序列、存储过程、索引、聚簇、同义词、数据库联结等。 数据块是 Oracle 数据库中的...
2. 默认表空间:用户创建的对象将存储在哪个表空间中。 3. 临时表空间:用于存储临时工作数据。 4. 表空间配额:限制用户在特定表空间上的存储量。 5. 概要文件:定义用户会话的资源限制和密码策略。 6. 帐户状态:...
表空间是Oracle数据库中的逻辑存储单元,用于存储数据库表和索引。表是Oracle数据库中的基本存储单元,用于存储数据。索引是Oracle数据库中的辅助存储结构,用于加速数据查询。视图是Oracle数据库中的虚拟表,用于...
SYSTEM表空间是Oracle数据库中的一个关键组成部分,在数据库创建时会自动创建。它包含了许多重要的数据库元数据和控制信息,对于数据库的正常运行至关重要。具体来说,SYSTEM表空间通常包含以下内容: 1. **数据...