07. Oracle企業管理

  • Oracle企業管理方式

  1. 通過OEM(Oracle Enterprise Manager)Oracle企業管理界面進行管理,首先要啟動相關服務,在瀏覽器輸入https://hostname:port/em進行登錄管理
  2. 使用sql語句直接進行創建管理
  3. 創建表空間和數據文件,創建用戶并授權,創建表及約束條件,創建表與表之間的關系

  • 表空間

  1. 在表空間默認不區分大小寫,所有的最終都會轉換成大寫進行處理
  2. 表空間:
    表空間名:TEST0402
    創建方式:小文件方式
  3. 數據文件:
    路徑:自行選擇
    數據文件名:一般為 表空間名.DBF
    初始大小:此處設置為100M
    數據文件滿后自動拓展:設置自動拓展幅度(值通常為初始文件的10%)
    最大文件大小:無限制
 CREATE SMALLFILE TABLESPACE "TEST0402"
 DATAFILE 'D:\APP\ORACLE\PRODUCT\11.2.0\DBHOME_2\ORADATA\ORCL\TEST0402.DBF' SIZE 100M
 AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED 
 LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
  1. 在SQL窗口中執行即可
image.png
  1. 創建完成,可通過以下sql查看基本信息
 select * from dba_tablespaces t where t.tablespace_name = 'TEST0402';--表空間
 select * from dba_data_files t where t.tablespace_name = 'TEST0402';--數據文件
 select * from dba_free_space t where t.tablespace_name = 'TEST0402';--未使用的表空間
image.png
  1. 創建臨時表空間(數據庫本身存在臨時表空間,因有時無法滿足需求,故可以手動創建,主要用途是提供臨時的運算空間,當運算完成之后系統會自動清理)
 CREATE TEMPORARY TABLESPACE "TEMP0402"
 TEMPFILE 'D:\APP\ORACLE\PRODUCT\11.2.0\DBHOME_2\ORADATA\ORCL\TEMP0402.DBF' SIZE 50M
 AUTOEXTEND ON NEXT 5M MAXSIZE 2048M 
 EXTENT MANAGEMENT LOCAL;
image.png
  1. 刪除表空間
DROP 表空間名 INCLUDING CONTENTS AND DATAFILES;

  • 用戶

  1. 系統安裝完成時,只有sys和system兩個用戶,為安全和使用考慮,需要為表空間創建用戶
  2. 一個表空間允許多個用戶訪問,而一個用戶通常只能訪問一個表空間

創建用戶

  1. 創建用戶并指定默認表空間和臨時表空間(修改用ALTER語句即可)
    其中:
    用戶名:USER0402
    密碼:AAaa1234
    默認表空間:TEST0402
    臨時表空間:TEMP0402
CREATE USER USER0402 IDENTIFIED BY AAaa1234
DEFAULT TABLESPACE TEST0402
TEMPORARY TABLESPACE TEMP0402;
  1. 查看新建的用戶
select t.* from dba_users t where t.username = 'USER0402';--用戶
select t.* from all_users t where t.username = 'USER0402';--用戶
select t.* from user_users t;--當前用戶
image.png
  1. 刪除用戶
DROP USER 用戶名
若用戶包含對象,則先刪除用戶所有的對象,再刪除用戶,如下:
DROP USER 用戶名 CASCADE

  • 角色

  1. oracle標準角色:
    DBA: 擁有全部特權,是系統最高權限,只有DBA才可以創建數據庫結構,超級系統管理員
    RESOURCE:擁有Resource權限的用戶只可以創建實體,不可以創建數據庫結構,普通用戶
    CONNECT:擁有Connect權限的用戶只可以登錄Oracle,不可以創建實體,不可以創建數據庫結構,臨時用戶
  2. 創建角色
    角色名:ROLE0403
CREATE ROLE ROLE0403;
  1. 查看新建的角色
select t.* from dba_roles t where t.role = 'ROLE0403';--所有角色
image.png
  1. 刪除角色
DROP ROLE 角色名;

  • 權限

  1. 權限分為系統權限和對象權限,系統權限即系統級別的操作,對象權限又稱為表級權限,即對表的操作
  2. 如果角色擁有管理選項,則此用戶可將自己的權限賦給其他的用戶
  3. 權限可直接賦予用戶,也可賦予角色,再將角色賦予用戶(推薦),同時多個權限或角色,中間用逗號分割
  4. 查看系統所有權限
select t.* from system_privilege_map t;--所有權限
image.png
  1. 賦予角色系統權限
    其中:將查詢所有表的權限賦給了角色ROLE0403
GRANT SELECT ANY TABLE TO ROLE0403;
select t.* from role_sys_privs t where t.role = 'ROLE0403';--角色擁有的系統權限
image.png
  1. 賦予角色對象權限
    其中:將查詢表INCFIL的權限賦予了角色ROLE0403
GRANT SELECT ON INCFIL TO ROLE0403;
select t.* from role_tab_privs t where t.role = 'ROLE0403';--角色擁有的對象權限
image.png
  1. 賦予用戶系統權限
    其中:將查詢所有字典的權限賦予用戶USER0402
GRANT SELECT ANY DICTIONARY TO USER0402;
image.png
  1. 賦予用戶對象權限
    其中:將查詢表INCVID的權限賦予了角色USER0402
GRANT SELECT ON INCVID TO USER0402;
select t.* from dba_tab_privs t where t.grantee = 'USER0402';--所有用戶擁有的對象權限
image.png
  1. 賦予用戶角色
    其中:將角色ROLE0403賦給用戶USER0402
    用戶擁有角色后,即擁有其權限
GRANT ROLE0403 TO USER0402;
image.png
  1. 撤銷權限
REVOKE 角色/權限 FROM 用戶名/角色
  1. 權限相關SQL
--所有權限
select t.* from system_privilege_map t;--所有權限
--系統權限
select t.* from dba_sys_privs t where t.grantee = 'USER0402';--所有用戶的系統權限
select t.* from user_sys_privs t;--當前用戶的系統權限
--對象權限
select t.* from dba_tab_privs t where t.grantee = 'USER0402';--所有用戶擁有的對象權限
select t.* from all_tab_privs t;--用戶擁有的對象權限
select t.* from user_tab_privs t;--用戶擁有的對象權限
--權限分配
select t.* from user_tab_privs_made t;--用戶授出的對象權限
select t.* from user_tab_privs_recd t;--用戶接受的對象權限
select t.* from user_col_privs_made t;--用戶授出的對列的對象權限
select t.* from user_col_privs_recd t;--用戶接受的對列的對象權限
--用戶角色關系
select t.* from dba_role_privs t where t.grantee = 'USER0402';--所有用戶擁有的角色
select t.* from user_role_privs t;--當前用戶擁有的角色
--角色權限關系
select t.* from role_sys_privs t where t.role = 'ROLE0403';--角色擁有的系統權限
select t.* from role_tab_privs t where t.role = 'ROLE0403';--角色擁有的對象權限

  1. 表是數據庫中的最基本的對象,用于存儲數據,沒有表的數據庫沒有任何意義
  2. 設計合理的表能大幅提升數據庫查詢性能,數據組織合理,便于開發數據庫代碼,節省數據存儲空間
  3. 表的設計,一般按照數據庫設計范式進行

創建表:

  1. 其中:
    表名:STUDENT
    所屬用戶:USER0402
    列名和數據類型為()內容
    所屬表空間:TEST0402
CREATE TABLE USER0402.STUDENT
(
  SID CHAR(6),
  SNAME VARCHAR2(10),
  SSEX CHAR(1),
  SAGE INTEGER,
  SPHONE VARCHAR2(12)
)
TABLESPACE TEST0402;
  1. 查看創建結果
select t.*,t.rowid from user0402.student t;
image.png
  1. 數據類型
數據類型 釋義
VARCHAR2(n) 1. n為必填參數,指定可變字符串的長度
2. n的最大值是4000,最小值是1
NVARCHAR2(n) 1. 其基本用法以及范圍同varchar2類型
2. 此可變字符串,依據所選國家的字符集
NUMBER(p,s) 1. 精度為p,數值范圍為s的數值
2. 精度p的范圍從1到38,數值范圍s的范圍是從-84到127
3. 有效位為從左邊第一個不為0的數開始,到右邊四舍五入位結束
4. s表示取值范圍,從小數點為0點,向右(正數)表示小數保留位數,向左(負數)表示整數保留四舍五入的開始位
5. p表示有效位的最大位數
NUMBER 等同于NUMBER(5)
LONG 可變長度的字符數據,長度最大2G個字節
DATE 有效日期范圍從公元前4712年1月1日到公元后4712年12月31日
RAW(n) 1. n為必填參數,指定原始二進制數據的最大長度
2. n的最大值為2000字節
LONG RAW 可變長度的原始二進制數據,最大長度為2G字節
CHAR(n) 1. 固定長度的字符數據,最大長度為n
2. n的最大值為2000,最小值為1
NCHAR(n) 與CHAR類型用法一致,且根據Unicode標準定義
CLOB 字符大型對象,可容納單字節字符,不支持寬度不等的字符集,最大為4G字節
NCLOB 與CLOB用法一致,且可存儲國家字符集
BLOB 二進制大型對象,最大4G字節
BFILE 包含一個大型二進制文件的定位器,存儲在數據庫外面,使得可以以字符流I/O訪問存在數據庫服務器上的外部LOB,最大為4G字節

  • 約束

約束即對列值的條件,但約束在一定程度上會降低數據庫性能
非空約束:

  1. 非空約束即not null,不允許列的值為空(有default值例外)
  2. 其中:為表USER0402.STUDENT的SNAME列添加非空約束
ALTER TABLE USER0402.STUDENT MODIFY SNAME NOT NULL;
select t.* from dba_constraints t where t.table_name like '%STUDENT%';--查看所有約束
image.png

主鍵約束:

  1. 主鍵約束即primary key,用來標識行的唯一性
  2. 設置為主鍵的列將會自動被創建索引
  3. 主鍵不允許為空值
  4. 主鍵約束可以定義在一個列上,也可以定義在多個列的組合上,但一個表中只包括一個主鍵
  5. 其中:為表USER0402.STUDENT添加主鍵名為STUDENT_SID,定義在表的SID列上
ALTER TABLE USER0402.STUDENT ADD CONSTRAINT STUDENT_SID PRIMARY KEY(SID);
select t.* from dba_constraints t where t.table_name like '%STUDENT%';--所有約束
image.png
  1. 主鍵默認創建索引,查看索引
select t.* from dba_indexes t where t.table_name like '%STUDENT%';
image.png

唯一約束:

  1. 唯一約束即unique,保證每一行的唯一性
  2. 同主鍵一樣,唯一約束也是通過索引實現的,故若所約束字段不存在索引,將自動創建索引
  3. 唯一約束可存在null值,且可存在多個null值,在查表時,因btree索引不包括null值,故判斷null值會進行全表掃描
  4. 一個表可存在多個唯一約束
  5. 其中:為表USER0402.STUDENT添加名為STUDENT_SPHONE的唯一約束,定義在表的SPHONE列上
ALTER TABLE USER0402.STUDENT ADD CONSTRAINT STUDENT_SPHONE UNIQUE(SPHONE);
select t.* from dba_constraints t where t.table_name like '%STUDENT%';--所有約束
image.png
  1. 查看約束
select t.* from dba_indexes t where t.table_name like '%STUDENT%';
image.png

外鍵約束:
外鍵約束定義在具有父子關系的子表中,外鍵約束使得子表中的列對應父表的主鍵列,用以維護數據庫的完整性。不過出于性能和后期的業務系統的擴展的考慮,很多時候,外鍵約束僅出現在數據庫的設計中,實際會放在業務程序中進行處理

  1. 外鍵約束的子表中的列和對應父表中的列數據類型必須相同,列名可以不同
  2. 對應的父表的列必須存在主鍵約束()PRIMARY KEY)或唯一約束(UNIQUE)
  3. 外鍵約束列允許NULL值
  4. 有外鍵刪除的表,在刪除記錄時,除非進行強制刪除或級聯刪除,否則不允許刪除
  5. 其中:為表USER0402.SCORE添加外鍵約束,名為STUDENT_SCORE_SID,添加列為SID,關聯父列為USER0402.STUDENT的SID列
方式一:刪除的時候,級聯刪除子表所有匹配的行
ALTER TABLE USER0402.SCORE ADD CONSTRAINT STUDENT_SCORE_SID FOREIGN KEY(SID) REFERENCES USER0402.STUDENT(SID) ON DELETE CASCADE; 
方式二:刪除父表中的對應行,會將對應子表中的所有匹配行的外鍵約束列置為NULL
ALTER TABLE USER0402.SCORE ADD CONSTRAINT STUDENT_SCORE_SID FOREIGN KEY(SID) REFERENCES USER0402.STUDENT(SID) ON DELETE SET NULL; 
image.png

檢查約束:

  1. 檢查約束可用來實施一些簡單的規則,比如列值必須在某個范圍內
  2. 檢查的規則必須是一個結果為true或false 的表達式
  3. 其中:為表USER0402.STUDENT添加名為STUDENT_SSEX的檢查約束,定義在SSEX字段上,檢查范圍為男女
ALTER TABLE USER0402.STUDENT ADD CONSTRAINT STUDENT_SSEX CHECK(SSEX IN('Male','Female'));
image.png

約束狀態:
因在進行老數據割接時,為保證源數據的完整性且能成功導入,有時需關閉約束的校驗,保證數據能全部正確的導入當前庫,導入結束后再打開約束

  1. 數據庫約束有兩類狀態
    啟用/禁用(enable/disable):是否對新變更的數據啟用約束驗證
    驗證/非驗證(validate/novalidate):是否對表中已存在的數據進行約束驗證
  2. 這兩類四種狀態可以隨意組合,默認是 enable validate
  3. 組合以及含義如下:
    enable validate:默認的約束組合狀態,無法添加違反約束的數據行,數據表中也不能存在違反約束的數據行
    enable novalidate:無法添加違反約束的數據行,但對已存在的違反約束的數據行不做驗證
    disable validate:可以添加違反約束的數據行,但對已存在的違反約束的數據行會做約束驗證(這是一種相互矛盾的約束組合,只不過是語法上支持這種組合罷了,結果是DML操作失敗)
    disable novalidate:可以添加違法約束的數據行,對已存在的違反約束的數據行也不做驗證
  4. 例如:將表USER0402.STUDENT的SNAME字段的非空約束改為禁用非驗證狀態
ALTER TABLE USER0402.STUDENT MODIFY CONSTRAINT SYS_C0011125 DISABLE NOVALIDATE;
image.png
  1. 數據導入結束后,再將其狀態改為啟用非驗證,確保新添加的數據滿足要求,且不會驗證已有數據
ALTER TABLE USER0402.STUDENT MODIFY CONSTRAINT SYS_C0011125 ENABLE NOVALIDATE;
image.png

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容