【转】oracle中的数据库、用户、计划、表空间、表目标之间的联系ITeye - 超凡娱乐

【转】oracle中的数据库、用户、计划、表空间、表目标之间的联系ITeye

2019年03月25日15时09分42秒 | 作者: 灵寒 | 标签: 用户,目标,数据库 | 浏览: 2415

 

最近在学习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 Grant 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,文章中有缺乏或许疏忽之处,还请高手耐性辅导,谢谢!

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表超凡娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章