一、创建数据库及模式
-- 创建示例数据库
create tablespace BOOKSHOP datafile 'BOOKSHOP.dbf' size 150;
-- 创建模式
create schema resources authorization sysdba;
/
create schema person authorization sysdba;
/
create schema sales authorization sysdba;
/
create schema production authorization sysdba;
/
create schema purchasing authorization sysdba;
/
create schema other authorization sysdba;
/
1、表空间
在 DM 数据库中,表空间由一个或者多个数据文件组成。DM 数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。在创建 DM 数据库时,会自动创建 5 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN表空间、TEMP 表空间和 HMAIN 表空间。
1. SYSTEM 表空间存放了有关 DM 数据库的字典信息,用户不能在 SYSTEM 表空间创建表和索引。
2. ROLL 表空间完全由 DM 数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行 DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
3. MAIN 表空间在初始化库的时候,就会自动创建一个大小为 128M 的数据文件MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
4. TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP表空间。
5. HMAIN 表空间属于 HTS 表空间,完全由 DM 数据库自动维护,用户无需干涉。当用户在创建 HUGE 表时,未指定 HTS 表空间的情况下,充当默认 HTS 表空间。
每一个用户都有一个默认的表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM,SYSDBA 的默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。如果用户在创建表的时候,指定了存储表空间 A,并且和当前用户的默认表空间 B 不一致时,表存储在用户指定的表空间 A 中,并且默认情况下,在这张表上面建立的索引也将存储在 A 中,但是用户的默认表空间是不变的,仍为 B。一般情况下,建议用户自己创建一个表空间来存放业务数据,或者将数据存放在默认的用户表空间 MAIN 中。
SYSTEM、ROLL、MAIN 和 TEMP 表空间查看语句:
SELECT * FROM V$TABLESPACE;
HMAIN 表空间查看语句:
SELECT * FROM V$HUGE_TABLESPACE;
2、模式
用户的模式(SCHEMA)指的是用户账号拥有的对象集,在概念上可将其看作是包含表、视图、索引和权限定义的对象。在 DM 中,一个用户可以创建多个模式,一个模式中的对象(表、视图等)可以被多个用户使用。模式不是严格分离的,一个用户可以访问他所连接的数据库中有权限访问的任意模式中的对象。系统为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户还可以用模式定义语句建立其它模式。
采用模式的原因有几点:
1. 允许多个用户使用一个数据库而不会干扰其它用户;
2. 把数据库对象组织成逻辑组,让它们更便于管理;
3. 第三方的应用可以放在不同的模式中,这样可以避免和其它对象的名字冲突。模式类似于操作系统层次的目录,只不过模式不能嵌套。
DM 模式可以通过 SQL 语句进行操作。DM 模式主要包含以下的模式对象:
1. 表;
2. 视图;
3. 索引;
4. 触发器;
5. 存储过程/函数;
6. 序列;
7. 全文索引;
8. 包;
9. 同义词;
10. 类;
11. 外部链接。
在引用模式对象的时候,一般要在模式对象名前面加上模式名。具体格式如下:
[模式名].对象名
当然,在当前模式和要引用的模式对象所属的模式相同时,可以省略模式名。如果我们访问一个表时,没有指明该表属于哪一个模式,系统就会自动给我们在表前加上缺省的模式名。类似地,如果我们在创建对象时不指定该对象的模式,则该对象的模式为用户的缺省模式。模式对象之外的其他对象统一称为非模式对象,非模式对象主要包括以下几种对象:
1. 用户;
2. 角色;
3. 权限;
4. 表空间。
二、创建表
set schema XXX ; -- 指定模式
-- 设置当前模式为 person
SET SCHEMA person;
-- 创建表
-- create address
drop table if exists person.address;
create table person.address(
addressid int identity(1,1) primary key,
address1 varchar(60) not null default '默认地址',
address2 varchar(60),
city varchar(30) not null,
postalcode varchar(15) not null
) storage (on BOOKSHOP);
comment ON table person.address is '地址表';
comment ON column person.address.addressid is '地址id';
comment ON column person.address.address1 is '地址1';
comment ON column person.address.address2 is '地址2';
comment ON column person.address.city is '城市';
comment ON column person.address.postalcode is '邮编';
drop table if exists person.address_type;
-- create address_type
create table person.address_type(
address_typeid int identity(1,1) primary key,
name varchar(50) not null
)storage (on bookshop);
-- create person
create table person.person(
personid int identity(1,1) cluster primary key,
sex char(1) not null,
name varchar(50) not null,
email varchar(50),
phone varchar(25)
) storage (on BOOKSHOP);
-- create person_type
create table person.person_type(
person_typeid int identity(1,1) primary key,
name varchar(256) not null
) storage (on BOOKSHOP);
三、初始化数据
DM数据库存在闪回操作,所以每次的DML操作会加入到事务中,我们可以对其进行rollback或者commit;
set schema person;
-- insert person_type
insert into person_type(name)
values('采购经理'),
('采购代表'),
('销售经理'),
('销售代表');
-- insert person
insert into person(sex,name,email,phone)
values('F','李 丽','lily@sina.com','02788548562'),
('M','王 刚','','02787584562'),
('M','李 勇','','02782585462'),
('F','郭 艳','','02787785462');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 孙 丽
','','13055173012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('M',' 黄 非
','','13355173012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 王 菲
','','13255173012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('M',' 张 平
','','13455173012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('M',' 张 红
','','13555173012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 刘 佳
','','13955173012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 王 南
','','15955173012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 李 飞
','','15954173012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 张大海
','','15955673012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 王宇轩
','','15955175012');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 桑泽恩
','','15955173024');
INSERT INTO PERSON.PERSON(SEX,NAME,EMAIL,PHONE) VALUES('F',' 刘 青
','','15955173055');
INSERT INTO PERSON.PERSON(SEX,NAME,PHONE) VALUES('F',' 杨凤兰
','02785584662');
--insert address_type
insert into address_type(name) values('发货地址');
INSERT INTO ADDRESS_TYPE(NAME) VALUES('送货地址');
insert into person.address_type(name)
values('家庭地址'),('公司地址');
-- 插入数据
-- insert address
insert into person.address(address1,address2,city,postalcode)
values('洪山区 369 号金地太阳城 56-1-202','','武汉市洪山区','430073'),
('青山区青翠苑 1 号','','武汉市青山区','430080'),
('武昌区武船新村 115 号','','武汉市武昌区','430063'),
('汉阳大道熊家湾 15 号','','武汉市汉阳区','430050');
INSERT INTO PERSON.ADDRESS(ADDRESS1,ADDRESS2,CITY,POSTALCODE) VALUES('洪山
区保利花园 50-1-304','','武汉市洪山区','430073');
INSERT INTO PERSON.ADDRESS(ADDRESS1,ADDRESS2,CITY,POSTALCODE) VALUES('洪山
区关山春晓 51-1-702','','武汉市洪山区','430073');
INSERT INTO PERSON.ADDRESS(ADDRESS1,ADDRESS2,CITY,POSTALCODE) VALUES('江汉
区发展大道 561 号','','武汉市江汉区','430023');
INSERT INTO PERSON.ADDRESS(ADDRESS1,ADDRESS2,CITY,POSTALCODE) VALUES('武昌
区武船新村 1 号','','武汉市武昌区','430063');
INSERT INTO PERSON.ADDRESS(ADDRESS1,ADDRESS2,CITY,POSTALCODE) VALUES('洪山
区关山春晓 55-1-202','','武汉市洪山区','430073');
INSERT INTO PERSON.ADDRESS(ADDRESS1,ADDRESS2,CITY,POSTALCODE) VALUES('洪山
区光谷软件园 C1_501','','武汉市洪山区','430073');
commit;