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上建立索引

相關文章
相關標籤/搜索