分类: Oracle
2010-09-09 11:48:36
表空间是什么
表空间实质是组织数据文件的一种途径,Oracle就是通过表空间这个数据库对象完成对数据的组织的。在将数据插入Oracle数据库之前,必须首先建立表空间,然后将数据插入表空间的一个对象中。解释数据库、表空间、数据文件、表、数据的最好办法就是想象一个装满东西的柜子。数据库其实就是柜子,柜中的抽屉是表空间,抽屉中的文件夹是数据文件,文件夹中的纸是表,写在纸上的信息就是数据。
根据表空间的用途可分为五类:
-目录表空间
每个数据库只有一个目录表空间,它是在发出 CREATE DATABASE 命令时创建的。目录表空间被 DB2 命名为 SYSCATSPACE,它保存了系统目录表。总是在创建数据库时创建该表空间。
-常规表空间
常规表空间保存表数据和索引。它还可以保存诸如大对象(Large Object,LOB)之类的长数据,除非这些数据显式地存储在长表空间中。如果某些表空间是数据库管理的空间(Database Managed Space,DMS),则可以将表及其索引分别放到单独的常规表空间中。我们将在本文后面定义 DMS 和系统管理的空间(System Managed Space,SMS)之间的区别。每个数据库中必须至少有一个常规表空间。创建数据库时指定该表空间的缺省名为 USERSPACE1。
-长表空间
长表空间用于存储长型或 LOB 表列,它们必须驻留在 DMS 表空间中。它们还可以存储结构化类型的列或索引数据。如果没有定义长表空间,那么将把 LOB 存储在常规表空间中。长表空间是可选的,缺省情况下一个都不创建。
-系统临时表空间
系统临时表空间用于存储 SQL 操作(比如排序、重组表、创建索引和连接表)期间所需的内部临时数据。每个数据库必须至少有一个系统临时表空间。随数据库创建的系统临时表空间的缺省名为TEMPSPACE1。
-用户临时表空间
用户临时表空间存储已声明的全局临时表。创建数据库时不存在用户临时表空间。至少应当创建一个用户临时表空间以允许定义已声明的临时表。用户临时表空间是可选的,缺省情况下一个都不创建
CREATE TABLESPACE message
DATAFILE '/opt/oracle/oradata/surecomp/message01.dbf' size 200M
EXTENT MANAGEMENT local;
CREATE USER message IDENTIFIED BY message
DEFAULT TABLESPACE message;
GRANT connect, resource TO message;
CREATE TABLE userinfo (
id VARCHAR2(32) NOT NULL,
name VARCHAR2(32) NOT NULL,
password VARCHAR2(32) NOT NULL,
CONSTRAINT userinfo_pk PRIMARY KEY (id),
CONSTRAINT userinfo_unique_name UNIQUE ( name )
);
这里先是用SYSTEM用户创建了一个message表空间
然后创建一个用户message,使这个message用户默认使用message表空间
之后创建一个表USER,这个时候USER表是不是应该在SYSTEM的临时表空间里?
那下次用message登陆往USER表中插记录的时候记录是不是就存在message表空间中?
SYSTEM表空间是不是只存了USER表的逻辑?
概念不清请指教
当你用system创建了message表空间,和message用户后,如果你不从system用户退出,再以message用户登陆,那么,运行以上创建表的指令,所创建的表userinfo,就会被system用户所拥有。所以,这个表应该在system表空间里。在这样的情况下,用户message与这张表没有任何关系。下次用message登陆时,message在一般情况下,不能往userinfo表里插记录,除非system给予message用户特别许可,(GRANT insert on system.userinfo TO message;)。如果system给予了这种许可,用户message所插的一切记录,都会储存在system表空间里,而不是在message表空间中。
显然,这是很糟糕的情况。一般情况下,应该避免让普通用户把数据储存在system表空间里。现有二种方法可以避免以上的情况:
1.从system用户退出,再以message用户登陆,然后运行以上创建表的指令。
2.依然是system用户登陆,修改上述创建表的指令。在表名前,加上用户名,并且在最后注明表空间名。请看下例:
CREATE TABLE message.userinfo
(
id VARCHAR2(32) NOT NULL,
name VARCHAR2(32) NOT NULL,
password VARCHAR2(32) NOT NULL,
CONSTRAINT userinfo_pk PRIMARY KEY (id),
CONSTRAINT userinfo_unique_name UNIQUE ( name )
)
TABLESPACE message;
用上述二种方法所创建的表userinfo,都会属于用户message。因此,message所插的一切记录,都会储存在message表空间中。