本文為原創,如需轉載,請標明出處 http://www.cnblogs.com/gudu1/p/7601765.html
---- 用戶權限
1.創建表空間 (創建用戶之前需要創建表空間和臨時表空間,若是沒有創建,10g之前默認是system永久性表空間,11g改為users永久性表空間)
create tablespace a_user
datafile 'D:\a_user_space.dbf'
size 10M
autoextend on;
2.創建臨時表空間(默認為temp臨時表空間)
create temporary tablespace a_user_temp
tempfile 'D:\a_user_temp.dbf'
size 10M
autoextend on;
3.創建用戶 (需要指定用戶名,密碼,表空間和臨時表空間)
create user a_user identified by 123456
default tablespace a_user
temporary tablespace a_user_temp;
4.授權 (授權需要在數據庫管理員登陸下進行授權,否則會提示你權限不足)
grant connect,resource to a_user;
以上就是創建一個新的用戶 並且指定表空間和臨時表空間,假如現在一個用戶想要訪問另一個用戶下的表怎么辦呢? 很簡單,給他權限就好。
--假設現在有兩個用戶user1和user2,然后user1下有張表emp,接下來我們把訪問emp表的權限授給user2(注意:這里登錄的用戶要么是管理員要么是user1)
grant select,update,delete,insert on emp to user2;
-- 突然有一天user1和user2鬧掰了,倆人不和,user1不給user2訪問權限了,怎么辦?
revoke select,update,delete,insert on emp from user2;
以下是一些簡單Oracle操作command:
刪除用戶:drop user user1 cascade;
修改用戶密碼:alter user user1 identified by 123456;
刪除表空間:drop tablespace a_user;
修改表空間大小:① alter tablespace a_user datafile 'D:\a_user_space' resize 20M; ② alter tablespace a_user add datafile 'D:\a_user_space2.dbf' size 10M autoextend on;
更多常用函數:http://www.cnblogs.com/rencongums/articles/5662537.html
---- Oracle序列使用
我們都知道SQLServer,MySql等數據庫都能夠添加自動增長列Identity,然而Oracle跟那些不太一樣,它是通過添加一個序列,插入數據的時候使用序列來自動生成順序列,不多廢話。下面是語法 ↓
--創建序列
CREATE SEQUENCE sequence //創建序列名稱
[INCREMENT BY Integer]
[START WITH Integer]
[{MAXVALUE Integer | NOMAXVALUE}]
[{MINVALUE Integer | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE Integer | NOCACHE}];
INCREMENT BY :用於定義序列的步長,如果省略,則默認為1,如果出現負值,則代表Oracle序列的值是按照此步長遞減的。
START WITH :定義序列的初始值(即產生的第一個值),默認為1。
MAXVALUE :定義序列生成器能產生的最大值。選項NOMAXVALUE是默認選項,代表沒有最大值定義,這時對於遞增Oracle序列,系統能夠產生的最大值是10的27次方;對於遞減序列,最大值是-1。
MINVALUE : 定義序列生成器能產生的最小值。選項NOMAXVALUE是默認選項,代表沒有最小值定義,這時對於遞減序列,系統能夠產生的最小值是?10的26次方;對於遞增序列,最小值是1。
NOMAXVALUE: 如果指定了NOMAXVALUE,Oracle將升序序列的最大值設為10^27,將降序序列的最大值設為-1,。這是默認選項。
NOMINVALUE:如果指定了NOMINVALUE,Oracle將升序序列的最小值設為1,將降序序列的最小值設為-10^26,。這是默認選項。
CYCLE和NOCYCLE : 表示當序列生成器的值達到限制值后是否循環。CYCLE代表循環,NOCYCLE代表不循環。如果循環,則當遞增序列達到最大值時,循環到最小值;最小值為1。對於遞減序列達到最小值時,循環到最大值。如果不循環,達到限制值后,繼續產生新值就會發生錯誤。
CACHE:使用CACHE選項時,該序列會根據序列規則生成一組序列號。保留在內存中,當使用下一個序列號時,可以更快的響應。當內存中的序列號用完時,系統會再次生成一組序列號保存在緩存中,這樣可以提高生成序列號的效率。ORACLE會默認生成20個序列號。
NOCACHE:不預先在內存中生成序列號。
--刪除序列
drop sequence seq_name;
--修改序列
Alter sequence seq_name
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
注意: 不能修改序列的START WITH屬性。在修改序列時,應注意升序序列的最小值應小於最大值。
%%%%%%% 使用序列設置主關鍵字時,在數據庫遷移時需要注意。由於遷移后的表中已經存在數據,如果不修改序列的起始值,將會在表中插入重復數據, 違背主鍵約束。所有在創建序列時要修改序列的起始值。
---- Oracle同義詞使用
優點:
1)簡化SQL語句
2)隱藏對象的名稱和所有者
3)為分布式數據庫的遠程對象提供了位置透明性
4)提供對對象的公共訪問
分類:私有同義詞和共有同義詞
創建:
私有:create [or replace] synonym synonym_name for table_name;
公有:create [or replace] public synonym synonym_name for table_name;
刪除:
私有:drop synonym synonym_name;
公有:drop public synonym synonym_name;
注意:創建同義詞同樣需要管理員授權,grant create synonym to user1;
--- 舉個例子,還是上面emp表,用戶是user1和user2,user1為emp表創建了私有同義詞,這個時候user2是否能夠訪問到呢?答案肯定是不能,如果創建了公有呢?結果還是不能,很納悶吧^_^,還差一個權限
grant select on emp to public; 授予權限之后,你再試試。 如果某個用戶下有張表你希望所有人都能夠訪問,這個時候你就可以使用公有同義詞,你總不能使用Grant select on emp to user2; 這個吧,那得有多煩啊,每創建一個用戶,你都要授權。
---- Oracle索引使用
索引是與表關聯的可選結構,是一種快速訪問數據的途徑,可提高數據庫性能。數據庫可以明確地創建索引,以加快對表執行SQL語句的速度。當索引鍵作為查詢條件時,該索引將直接指向包含這些行的位置。
即便刪除索引,也無須修改任何SQL語句的定義。
索引分類:
| 物理分類 | 邏輯分類 |
| 分區或非分區索引 | 單列或組合索引 |
| B樹索引 | 唯一或非唯一索引 |
| 正常或反向鍵索引 | 基於函數索引 |
| 位圖索引 |
創建索引:
B樹:create index index_name on table_name(column_list);
組合:create index index_name on table_name(column_list);
反向鍵索引:create index index_name on table_name(column_list) reservse;
位圖索引:create bitmap index index_name on table_name(column_list);
唯一索引:create unique index index_name on table_name(column_list);
刪除索引:drop index index_name;
重建索引:alter index index_name rebuild noreverse;(將反向鍵索引更改為B樹索引)
建立索引原則:
1)頻繁搜索的列可以作為索引。
2)經常排序、分組的列可作為索引。
3)經常用作連接的列(主鍵 / 外鍵)可作為索引。
4)將索引放在一個單獨的表空間中,不要放在有回退段、臨時段和表的表空間中。
5)對大型索引而言,考慮使用 NOLOGGING子句創建大型索引。
6)根據業務數據發生的頻率,定期重新生成或重新組織索引.並進行碎片整理。
7)僅包含幾個不同值的列不可以創建為B樹索引,可根據需要創建位圖索引。
8)不要在僅包含幾行的表中創建索引。
---- Oracle分區
分類:范圍分區、列表分區、散列分區、復合分區、間隔分區和虛擬列分區等。
下面 介紹一下范圍分區 和 間隔分區--
范圍分區:
應用范圍比較廣的表分區方式,它以列的值作為分區的划分條件,將記錄存放到列值所在的range分區中。
創建:
Create table user
(
user_id number,
user_name number,
birthday date not null
.........
)
partition by range(birthday)
(
partition p1 values less than (to_date('2017-01-01'),'yyyy-MM-dd'),
partition p1 values less than (to_date('2016-01-01','yyyy-MM-dd')),
partition p3 values less than (maxvalue)
)
添加:
alter table table_name add partition p4 less than (to_date('2015-01-01','yyyy-MM-dd'));
合並:
alter table table_name merge partitions p1,p2 into partition p2;
刪除:
alter table table_name drop partition p1;
間隔分區:
間隔分區是范圍分區的一種增強功能,可以實現范圍分區的自動化。
創建:
Create table user
(
user_id number,
user_name number,
birthday date not null
.........
)
partition by range(birthday)
interval(numtoyminterval(1,'MONTH'))
(partition p1 values less than (to_date('2016-01-01','yyyy-MM-dd')));
解釋:
1)只需創建第一個開始分區,如上面的P1.
2)INTERVALONUMTOYMINTERVAL(3, 'MONTE')語句中, INTERVAL 代表“間隔即按照后面括號中的定義間隔添加分區。
3)NUMTOYMINTERVAL(3, 'MONTH')表示每3個月為一個分區。
NUMTOYMINTERVAL(n,'Interval_unit')函數用於將n轉換成 interval_unit 所指定的值。
interval_unit 可以為 YEAR 或 MONTE 。
舉例:
NUMTOYMINTERVAL(1,'YEAR'):每1年為一個分區。
NUMTOYMINTERVAL(1, 'MONTH'):每1個月為一個分區。
與該類型相關的函數還有 NUMTODSINTERVAL(n, 'interval_unit'),用於將n轉換成 interval_unit 所指定的值。
interval_unit 可以為 DAY , HOUR , MINUTE , SECOND 。
注意該函數不支持 YEAR 和 MONTH 。
4)系統會根據數據自動創建分區。
未完待續。。。。。。。。。。。。。
