Oracle中用户(user)、模式(schema)、表空间(tablespace)的概念
Oracle数据库是开发中最常用的数据库之一,在使用过程中有几个常见概念,记录如下。
-
用户(user)
user在Oracle中的主要是用于身份验证,权限分配的一个标识。在连接数据库和操作数据库对象时就是通过用户进行身份和权限的验证。
-
模式(schema)
Oracle中的schema是若干个数据库对象的集合,用于管理数据库中的各种对象,这里的对象包括:表、视图、存过、序列、索引等等。一个schema下包括若干个表、视图、存过等对象。
-
表空间(tablespace)
数据文件和日志文件是数据库中最关键的文件。它们是数据存储的地方。每一个数据库至少有一个与之相关的数据文件,通常情况下不仅仅一个,有非常多。数据在数据文件里是怎样组织的?
表空间就是一个用于管理数据文件的逻辑容器,它是与数据文件相关联的,一个表空间至少要有一个数据文件与之关联。与user和schema相比,tablespace是一个相对更加底层的概念,可以通过create tablespace创建表空间。
下面通过图形数据库管理软件的图形化界面进一步解释这几个概念之间的关系,下图是Navicat中的一张截图:
在创建这个数据库连接时指定的user是SYSTEM。
在Oracle中当我们创建一个用户时,系统会自动为该用户创建一个默认的schema,并且用user的名字作为这个schema的名字。这就是上图中看到的每个用户的连接下面都会有一个与用户名同名的schema。
需要注意的是,在Oracle中,使用者不能直接创建schema,想要创建schema就只能通过创建一个user来实现。(尽管Oracle中有create schema语句,但是他并不是用来创建schema的)。所以,可以得出一个结论:在Oracle中user的个数与schema的个数是相等的。
但是在Oracle中可以修改用户默认的模式:ALTER SESSION SET CURRENT_SCHEMA = scott; --改变用户缺省schema名。
每个用户除了拥有一个默认的schema之外,还可以拥有其他的schema,这就意味着一个用户除了可以操作自己名下的表,也可以通过授权来操作其他用户的表。即,每个schema中的对象都是可以被其他用户共享的,当然,前提是其他用户要有相应的权限。
既然一个用户可以操作多个schema中的对象,那么,当我们用某个特定的用户名和密码与数据库建立连接后,系统是怎么确认我们操作的是哪张表呢?
很简单,类似于在java中通过 对象名.方法名 来调用某个对象的方法一样,Oracle中可以用 模式名.对象名 来唯一确定要操作的对象。例如,通过scott用户与数据库建立连接,执行 select * from emp 时,此时没有指定schema,则默认操作的是scott用户下的默认schema中的emp表,即scott.emp 。如果scott用户下还有一个名为test的schema,我们想要操作test下的emp表,就需要指定模式名:select * from test.emp 。
Schema 与tablespace之间没有什么联系,同一个schema的对象能够存储在不同的表空间中,同一个表空间中能够存储不同schema的对象。
而user和tablespace之间也没有啥关系,在实际使用中只需要注意user和schema之间的关系即可。