Oracle之表空间、索引、管理权限及角色

Oracle表空间sql

表空间是数据库的逻辑组成部分,从物理上讲,数据库数据存放在数据文件中数据库

从逻辑上讲,数据库则是存放在表空间中,表空间由一个或多个数据文件组成session

wKiom1fpyzDDCoKpAACDrO4qO_I324.jpg

数据库的逻辑结构oracle

oracle中逻辑结构包括表空间、段、区和块ide

说明一下数据库由表空间构成,而表空间又是由段构成,而段又是由区构成,而函数

区又是由oracle块构成的这样的一种结构,能够提升数据的效率工具


表空间用于从逻辑上组织数据库的数据。数据库逻辑上是由一个或是多个表空间组成的性能

经过表空间能够达到如下做用:this

一、控制数据库占用的磁盘空间spa

二、dba能够将不一样数据类型部署到不一样的位置,这样有利于提升I/O性能,同时

利于备份和恢复等管理操做


创建表空间

创建表空间是使用create tablespace命令完成的,须要注意的是,通常状况下,创建表空间

是特权用户或是dba来执行的,若是用其余用户来建立表空间,则用户须要具备create tablespace

的系统权限


创建数据表空间

在创建数据库后,为便于管理表,最好创建本身的表空间

SQL> create tablespace data01 datafile '/oracle/datafile/data01.dbf' size 10m uniform 128k;

create tablespace data01 datafile '/oracle/datafile/data01.dbf' size 10m uniform 128k

                                                                                 *

ERROR at line 1:

ORA-02180: invalid option for CREATE TABLESPACE

报错区域在uniform 128k,区大小设置错误

SQL> create tablespace data01 datafile '/oracle/datafile/data01.dbf' size 10m;


Tablespace created.

查看表空间信息

[oracle@aliyun_test oracle]$ ll datafile/data01.dbf 

-rw-r----- 1 oracle oinstall 10493952 Sep 27 09:54 datafile/data01.dbf


使用数据表空间(若是不带表空间,默认会放到system表空间)

建立一张表,并将表空间data01给建立的这张表

SQL> create table mydept(deptno number(2),dname varchar2(14),loc varchar2(13)) tablespace data01;


Table created.

建立好的表空间如何查询呢?由表的信息dab_tablespaces来进行查询,先查看表结构以及字段说明

SQL> desc dba_tablespaces;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 TABLESPACE_NAME                           NOT NULL VARCHAR2(30)

 BLOCK_SIZE                                NOT NULL NUMBER

 INITIAL_EXTENT                                     NUMBER

 NEXT_EXTENT                                        NUMBER

 MIN_EXTENTS                               NOT NULL NUMBER

 MAX_EXTENTS                                        NUMBER

 MAX_SIZE                                           NUMBER

 PCT_INCREASE                                       NUMBER

 MIN_EXTLEN                                         NUMBER

 STATUS                                             VARCHAR2(9)

 CONTENTS                                           VARCHAR2(9)

 LOGGING                                            VARCHAR2(9)

 FORCE_LOGGING                                      VARCHAR2(3)

 EXTENT_MANAGEMENT                                  VARCHAR2(10)

 ALLOCATION_TYPE                                    VARCHAR2(9)

 PLUGGED_IN                                         VARCHAR2(3)

 SEGMENT_SPACE_MANAGEMENT                           VARCHAR2(6)

 DEF_TAB_COMPRESSION                                VARCHAR2(8)

 RETENTION                                          VARCHAR2(11)

 BIGFILE                                            VARCHAR2(3)

 PREDICATE_EVALUATION                               VARCHAR2(7)

 ENCRYPTED                                          VARCHAR2(3)

 COMPRESS_FOR                                       VARCHAR2(12)

查看表空data01:

SQL> select * from dba_tablespaces where tablespace_name='DATA01';

TABLESPACE_NAME                BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS   MAX_SIZE PCT_INCREASE MIN_EXTLEN STATUS    CONTENTS  LOGGING   FORCE_LOGGING EXTENT_MANAGEMENT ALLOCATION_TYPE PLUGGED_IN SEGMENT_SPACE_MANAGEMENT DEF_TAB_COMPRESSION RETENTION   BIGFILE PREDICATE_EVALUATION ENCRYPTED COMPRESS_FOR

------------------------------ ---------- -------------- ----------- ----------- ----------- ---------- ------------ ---------- --------- --------- --------- ------------- ----------------- --------------- ---------- ------------------------ ------------------- ----------- ------- -------------------- --------- ------------

DATA01                               8192          65536                       1  2147483645 2147483645                   65536 ONLINE    PERMANENT LOGGING   NO            LOCAL             SYSTEM          NO         AUTO                     DISABLED            NOT APPLY   NO      HOST                 NO        

能够详细清楚的查询该表空间的详细信息


修改表空间的状态

当创建表空间时,表空间处于online状态,此时该表空间时能够访问的,而且该表空间时能够读写的

既能够查询该表空间的数据,并且还能够在表空间执行各类语句。可是在进行系统维护或是数据

维护时,可能须要改变表空间的状态。通常状况下由特权用户或是dba来操做

一、使表空间脱机

alter tablespace data01 offline;  data01就是表空间名称

二、使表空间联机

alter tablespace data01 online;

三、将表空间设为只读状态

当创建表空间时,表空间能够读写,若是不但愿在该表空间上执行update,delete,insert

等操做,那么能够将表空间修改成只读表空间

alter tablespace data01 read only;

事例以下:

上述已经使用了表空间在表mydept上面,因而向里面插入数据


SQL> insert into mydept values (1,'xiaohuang','wuhan');


1 row created.

而后将表空间设置为只读状态


SQL> alter tablespace data01 read only;


Tablespace altered.

而后再向表mydept插入数据,看下是否成功

SQL> insert into mydept values (2,'xiaobai','shanghai');

insert into mydept values (2,'xiaobai','shanghai')

            *

ERROR at line 1:

ORA-00372: file 5 cannot be modified at this time

ORA-01110: data file 5: '/oracle/datafile/data01.dbf'

提示出错,表示不能修改表空间的数据文件

如何恢复呢,只需再将表空间设置为可读可写就行,见以下操做

SQL> alter tablespace data01 read write;


Tablespace altered.

而后再向里面插入数据便可

SQL> insert into mydept values (2,'xiaobai','shanghai');


1 row created.

插入数据成功


删除表空间

通常状况下,由特权用户或是dba操做,若是是其余用户操做,须要具备drop tablespace系统权限

drop tablespace '表空间名' including contents and datafiles;

说明:including contents表示删除表空间的同时删除该表空间的全部数据库对象,而datafiles

表示将数据库文件也删除

SQL> drop tablespace data01 including contents and datafiles;


Tablespace dropped.

表示删除表空间操做完成,下面查看是否已经删除

SQL> select * from dba_tablespaces where tablespace_name='DATA01';


no rows selected      由dba_tablespaces表查询并无查询到,即已经删除


[oracle@aliyun_test ~]$ ll /oracle/datafile/

total 0       能够看出数据文件也已经删除掉了


一、知道表空间名,显示该表空间包括的全部表

再次建立表空间data01来使用

SQL> create tablespace data01 datafile '/oracle/datafile/data01.dbf' size 10m;


Tablespace created.

建立一张表使用该表空间

SQL> create table mydept(deptno number(2),dname varchar2(14),loc varchar2(13)) tablespace data01;


Table created.

而后经过表空间名data01如何来查询到什么表使用了它呢?

使用到的表为all_tables

SQL> desc all_tables;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 OWNER                                     NOT NULL VARCHAR2(30)

 TABLE_NAME                                NOT NULL VARCHAR2(30)

 TABLESPACE_NAME                                    VARCHAR2(30)

能够查询到有一个tablespace_name的字段,因而以下操做

SQL> select tablespace_name,table_name from all_tables where tablespace_name='DATA01';


TABLESPACE_NAME                TABLE_NAME

------------------------------ ------------------------------

DATA01                         MYDEPT

查询到使用的表以及对应的表空间


如上,知道了表名称也能够知道表空间

SQL> conn scott/redhat@test;

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 

Connected as scott@test


SQL> select tablespace_name,table_name from user_tables where table_name='MYDEPT';

TABLESPACE_NAME                TABLE_NAME

------------------------------ ------------------------------

DATA01                         MYDEPT

下面使用system用户查询的

SQL> select tablespace_name,table_name from all_tables where table_name='MYDEPT';

TABLESPACE_NAME                TABLE_NAME

------------------------------ ------------------------------

DATA01                         MYDEPT

经过2,能够了解到scott.emp表是在system这个表空间上,若是将表空间system改成只读

可是不会成功,由于system是系统表空间,若是是普通表空间,就能够修改成只读


扩展表空间

表空间是由数据文件组成的,表空间的大小实际就是数据文件相加后的大小,假定表emp存放在

data01表空间上,初始大小为2m,当数据满2m后,若是再向表emp插入数据,这样就会显示空间不足的错误

因此就须要扩展表空间?

一、增长数据文件

alter tablespace data01 add datafile '/oracle/datafile/data02.dbf' size 20m;

SQL> alter tablespace data01 add datafile '/oracle/datafile/data02.dbf' size 20m;


Tablespace altered.

[oracle@aliyun_test ~]$ ll /oracle/datafile/

total 30736

-rw-r----- 1 oracle oinstall 10493952 Sep 27 14:05 data01.dbf

-rw-r----- 1 oracle oinstall 20979712 Sep 27 14:06 data02.dbf


二、增长数据文件的大小

alter tablespace data01 '/oracle/datafile/data01.dbf' resize 20m;


三、设置文件的自动增加

alter tablespace data01 '/oracle/datafile/data01.dbf' autoextend on next 10m maxsize 500m;


如何迁移表空间的数据文件?

一、肯定数据文件所在的表空间

select tablespace_name from dba_data_files where file_name='/oracle/datafile/data01.dbf';

TABLESPACE_NAME

------------------------------

DATA01

知道了表空间后,而后使表空间状态脱机

二、使表空间脱机

确保数据文件的一致性,将表空间转变为offline状态

alter tablespace data01 offline;

三、使用命令移动数据文件到指定的目标位置

sql>host move /oracle/datafile/data01.dbf /test/oracle/datafile/data01.dbf;

四、执行alter tablespace命令,数据文件重命名

在物理上移动了数据后,还必须执行alter tablespace命令对数据库文件进行逻辑修改

alter tablespace data01 rename datafile '/oracle/datafile/data01.dbf' to '/test/oracle/datafile/data01.dbf';

五、使表空间联机状态

在移动了数据文件后,为了使用户能够访问该表空间,必须将其转变为online状态

alter tablespace data01 online;

至此迁移表空间的数据文件完成


显示表空间信息

查询数据字典视图dba_tablespaces,显示表空间的信息

select tablespace_name from dba_tablespaces;


显示表空间所包含的数据文件

查询数据字典视图dba_data_files,可显示表空间所包含的数据文件

select file_name,bytes from dba_data_files where tablespace_name='表空间名';


其余表空间

除了经常使用的数据表空间外,还有其余类型的表空间

一、索引表空间

二、undo表空间

三、临时表空间

四、非标准块表空间





数据的完整性

数据的完整性用于确保数据库听从必定的商业和逻辑规则,在oracle中,数据完整性可使用约束

触发器、应用程序(过程、函数)三种方法来实现,在这三种方法中,由于约束易于维护而且具备

最好的性能,因此做为维护数据完整性的首选


约束

约束用于确保数据库数据知足特定的商业规则,在oracle中,约束包括:not null、unique、primary key、foreign key和check五种。

not null:非空,若是在列上定义了not null,那么插入数据时,必须为列提供数据


unique:惟一键,当定义了惟一的约束,该列的值是不能重复的,可是能够为null


primary key:主键,用于惟一的标识表行的数据,当定义主键约束后,该列不但不能重复并且不能为null一张表最多只能有一个主键,可是能够有多个惟一键


foreign key:外键,用于定义主表和从表之间的关系,外键约束要定义在从表上,主表则必须具备主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为null


check:用于强制行数据必须知足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,若是不在1000~2000之间就会提示错误

SQL> create table goods(goodid char(8) primary key,--主键

  2  goodname varchar2(30),

  3  unitprice number(10,2) check (unitprice > 0),--单价必须大于0

  4  category varchar2(8),

  5  provider varchar2(30))

  6  ;


SQL> create table customer(customerid char(8) primary key, --主键

  2  name varchar2(20) not null,--不为空

  3  address varchar2(20),

  4  email varchar2(20) unique,--不容许重复,惟一键

  5  sex char(4) default '男' check(sex in ('男','女')),---默认为男,不是男就是女

  6  cardid char(18))

  7  ;


SQL> create table purchase(customerid char(8) references customer(customerid),---因为这是外键,必须关联到主表的字段

  2  goodid char(8) references goods(goodid),--同上,数据类型必须和主表一致

  3  nums number(5) check(nums between 1 and 30))  --数量必须在1~30之间

  4  ;


若是在建表时忘记创建必须的约束,则能够在建表后使用alter table命令为

表增长相应的约束。可是注意:增长not null约束是修改null约束,即便用关键字

modify选项,而增长其余的约束则使用add关键字选项

alter table goods modify gooname not null;


alter table customer add constraint cardunique(约束名) unique(cardid(char);


alter table customer add constraint addresscheck check(address in ('东城','西城'));


删除约束

当不须要某个约束时,能够进行删除

alter table 表名 drop constraint 约束名称;


当删除主键约束的时候,可能会报错

alter table 表名 drop primary key;

这是由于若是在两张表存在主从关系,那么删除主表的主键约束时,必须带上cascade选项,例

alter table 表名 drop primary key cascade;   至关于破坏了主外键关系


显示约束信息

一、显示约束信息

经过查询数据字典视图user_constraint,能够显示当前用户的全部的约束信息

select constraint_name,constraint_type,status,validated from user_constraints where table_name='表名';


二、显示约束列

经过查询数据字典视图user_cons_columns,能够显示约束所对用的表列信息

select column_name,position from user_cons_columns where constraint_name='约束名';


三、固然也有容易的方法,使用pl/sql工具查看


定义约束有以下方式:

列级定义

列级定义是在定义列的同时定义约束

如在department表定义主键约束

create table department(dept_id number(2) constraint pk_department primary key,name varchar(12),loc varchar2(12));

关键字:constraint 约束名称:pk_department 约束类型:primary key


表级定义

表级定义是指在定义了全部列后,在定义约束,not null约束只能在列级上定义

create emp2(emp_id number(4),name varchar2(15),dept_id number(2),constraint pk_emp primary key(emp_id),constraint

fk_department foreign key(dept_id) references department(dept_id));


索引是用于加速数据存取的数据对象,合理的使用索引能够大大下降I/O次数,从而提升数据访问性能

建立索引

单列索引是基于单个列所创建的索引

create index 索引名 on 表名(列名)

以name字段查询:select * from customer where name='sp';若是常常这样查就能够将name字段建立索引,提升查询速度

create index name_index on customer(name);---给name字段创建index


复合索引

复合索引是基于两列或是多列的索引,在同一张表上能够有多个索引,可是要求列的组合必须不一样

create index emp_index1 on emp(ename,job);select * from customer where ename='sp' and job='MANAGER';建立联合索引

create index emp_index1 on emp(job,ename);


使用原则

一、在大表上创建索引才有意义

二、在where字句或是链接条件上常常引用 的列上建立索引

三、索引的层次不要超过4层(多级索引不要超过4层)


索引的缺点

一、创建索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引

二、更新数据的时候,系统必需要有额外的实际来同时对索引进行更新,以维持数据和索引的一致性


以下字段创建索引是不恰当的

一、不多或从不引用的字段

二、逻辑型的字段,如男或女等,提升查询速率是以消耗必定的系统资源为代价的,索引不能盲目的创建


显示表的全部索引

在同一张表上能够有多个索引,经过查询数据字典视图dba_indexes和user_indexes,能够显示索引信息其中dba_indexes

用于显示数据库全部的索引信息,而user_indexs用于显示当前用户的索引信息

select index_name,index_type fom user_indexes where table_name='表名';


显示索引列

经过查询数据字典视图user_ind_columns,能够显示索引对应的列的信息

select table_name,column_name fom user_ind_columns where index_name='索引名';




管理权限和角色

系统权限介绍

系统权限是指执行特定类型sql命令的权利,它用于控制用户能够执行的一个或是一组数据库操做。好比当用户

具备create table权限时,能够在其方案中建表,当用户具备100中系统权限

经常使用的有:

create session链接数据库                             create table建表

create view建视图 create public sysnonym:键赞成词

create procedure创建过程、函数、包                   create trigger建触发器

create cluster建簇


显示系统权限

oracle提供了多条系统权限,并且oracle的版本越高,提供的系统权限就越多

select * from system_privilege_map order by name;




授予系统权限

通常状况下,授予系统权限是由dba完成的,若是其余用户来授予系统权限,则要求该用户必须具备grant any privilege

的系统权限,能够带有with admin option选项,被授予的用户或是角色还能够将该系统权限授予其余用户

一、建立两个用户ken,tom

create user ken identified by redhat;


二、给用户key受权

grant create session,Crete table to ken with admin option;

grant create view to  ken;


三、给tom受权

grant create session,create table to tom;这是登陆的系统权限

revoke create session from tom;



授予数据对象权限

角色不能带有with grant option(授予角色)

只修改某张表的某一列(字段)

grant update on emp(sal) to monkey;只能在表中的字段sal上修改

grant select on emp(ename,sal) to monkey;能在字段ename,sal上查询


grant index on emp to monkey;容许monkey能在表emp上建立索引

相关文章
相关标签/搜索