-
Oracle企業管理方式
- 通過OEM(Oracle Enterprise Manager)Oracle企業管理界面進行管理,首先要啟動相關服務,在瀏覽器輸入https://hostname:port/em進行登錄管理
- 使用sql語句直接進行創建管理
- 創建表空間和數據文件,創建用戶并授權,創建表及約束條件,創建表與表之間的關系
-
表空間
- 在表空間默認不區分大小寫,所有的最終都會轉換成大寫進行處理
- 表空間:
表空間名:TEST0402
創建方式:小文件方式 - 數據文件:
路徑:自行選擇
數據文件名:一般為 表空間名.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
- 在SQL窗口中執行即可
image.png
- 創建完成,可通過以下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
- 創建臨時表空間(數據庫本身存在臨時表空間,因有時無法滿足需求,故可以手動創建,主要用途是提供臨時的運算空間,當運算完成之后系統會自動清理)
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
- 刪除表空間
DROP 表空間名 INCLUDING CONTENTS AND DATAFILES;
-
用戶
- 系統安裝完成時,只有sys和system兩個用戶,為安全和使用考慮,需要為表空間創建用戶
- 一個表空間允許多個用戶訪問,而一個用戶通常只能訪問一個表空間
創建用戶
- 創建用戶并指定默認表空間和臨時表空間(修改用ALTER語句即可)
其中:
用戶名:USER0402
密碼:AAaa1234
默認表空間:TEST0402
臨時表空間:TEMP0402
CREATE USER USER0402 IDENTIFIED BY AAaa1234
DEFAULT TABLESPACE TEST0402
TEMPORARY TABLESPACE TEMP0402;
- 查看新建的用戶
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
- 刪除用戶
DROP USER 用戶名
若用戶包含對象,則先刪除用戶所有的對象,再刪除用戶,如下:
DROP USER 用戶名 CASCADE
-
角色
- oracle標準角色:
DBA: 擁有全部特權,是系統最高權限,只有DBA才可以創建數據庫結構,超級系統管理員
RESOURCE:擁有Resource權限的用戶只可以創建實體,不可以創建數據庫結構,普通用戶
CONNECT:擁有Connect權限的用戶只可以登錄Oracle,不可以創建實體,不可以創建數據庫結構,臨時用戶 - 創建角色
角色名:ROLE0403
CREATE ROLE ROLE0403;
- 查看新建的角色
select t.* from dba_roles t where t.role = 'ROLE0403';--所有角色
image.png
- 刪除角色
DROP ROLE 角色名;
-
權限
- 權限分為系統權限和對象權限,系統權限即系統級別的操作,對象權限又稱為表級權限,即對表的操作
- 如果角色擁有管理選項,則此用戶可將自己的權限賦給其他的用戶
- 權限可直接賦予用戶,也可賦予角色,再將角色賦予用戶(推薦),同時多個權限或角色,中間用逗號分割
- 查看系統所有權限
select t.* from system_privilege_map t;--所有權限
image.png
- 賦予角色系統權限
其中:將查詢所有表的權限賦給了角色ROLE0403
GRANT SELECT ANY TABLE TO ROLE0403;
select t.* from role_sys_privs t where t.role = 'ROLE0403';--角色擁有的系統權限
image.png
- 賦予角色對象權限
其中:將查詢表INCFIL的權限賦予了角色ROLE0403
GRANT SELECT ON INCFIL TO ROLE0403;
select t.* from role_tab_privs t where t.role = 'ROLE0403';--角色擁有的對象權限
image.png
- 賦予用戶系統權限
其中:將查詢所有字典的權限賦予用戶USER0402
GRANT SELECT ANY DICTIONARY TO USER0402;
image.png
- 賦予用戶對象權限
其中:將查詢表INCVID的權限賦予了角色USER0402
GRANT SELECT ON INCVID TO USER0402;
select t.* from dba_tab_privs t where t.grantee = 'USER0402';--所有用戶擁有的對象權限
image.png
- 賦予用戶角色
其中:將角色ROLE0403賦給用戶USER0402
用戶擁有角色后,即擁有其權限
GRANT ROLE0403 TO USER0402;
image.png
- 撤銷權限
REVOKE 角色/權限 FROM 用戶名/角色
- 權限相關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';--角色擁有的對象權限
-
表
- 表是數據庫中的最基本的對象,用于存儲數據,沒有表的數據庫沒有任何意義
- 設計合理的表能大幅提升數據庫查詢性能,數據組織合理,便于開發數據庫代碼,節省數據存儲空間
- 表的設計,一般按照數據庫設計范式進行
創建表:
- 其中:
表名:STUDENT
所屬用戶:USER0402
列名和數據類型為()內容
所屬表空間:TEST0402
CREATE TABLE USER0402.STUDENT
(
SID CHAR(6),
SNAME VARCHAR2(10),
SSEX CHAR(1),
SAGE INTEGER,
SPHONE VARCHAR2(12)
)
TABLESPACE TEST0402;
- 查看創建結果
select t.*,t.rowid from user0402.student t;
image.png
- 數據類型
數據類型 | 釋義 |
---|---|
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字節 |
-
約束
約束即對列值的條件,但約束在一定程度上會降低數據庫性能
非空約束:
- 非空約束即not null,不允許列的值為空(有default值例外)
- 其中:為表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
主鍵約束:
- 主鍵約束即primary key,用來標識行的唯一性
- 設置為主鍵的列將會自動被創建索引
- 主鍵不允許為空值
- 主鍵約束可以定義在一個列上,也可以定義在多個列的組合上,但一個表中只包括一個主鍵
- 其中:為表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
- 主鍵默認創建索引,查看索引
select t.* from dba_indexes t where t.table_name like '%STUDENT%';
image.png
唯一約束:
- 唯一約束即unique,保證每一行的唯一性
- 同主鍵一樣,唯一約束也是通過索引實現的,故若所約束字段不存在索引,將自動創建索引
- 唯一約束可存在null值,且可存在多個null值,在查表時,因btree索引不包括null值,故判斷null值會進行全表掃描
- 一個表可存在多個唯一約束
- 其中:為表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
- 查看約束
select t.* from dba_indexes t where t.table_name like '%STUDENT%';
image.png
外鍵約束:
外鍵約束定義在具有父子關系的子表中,外鍵約束使得子表中的列對應父表的主鍵列,用以維護數據庫的完整性。不過出于性能和后期的業務系統的擴展的考慮,很多時候,外鍵約束僅出現在數據庫的設計中,實際會放在業務程序中進行處理
- 外鍵約束的子表中的列和對應父表中的列數據類型必須相同,列名可以不同
- 對應的父表的列必須存在主鍵約束()PRIMARY KEY)或唯一約束(UNIQUE)
- 外鍵約束列允許NULL值
- 有外鍵刪除的表,在刪除記錄時,除非進行強制刪除或級聯刪除,否則不允許刪除
- 其中:為表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
檢查約束:
- 檢查約束可用來實施一些簡單的規則,比如列值必須在某個范圍內
- 檢查的規則必須是一個結果為true或false 的表達式
- 其中:為表USER0402.STUDENT添加名為STUDENT_SSEX的檢查約束,定義在SSEX字段上,檢查范圍為男女
ALTER TABLE USER0402.STUDENT ADD CONSTRAINT STUDENT_SSEX CHECK(SSEX IN('Male','Female'));
image.png
約束狀態:
因在進行老數據割接時,為保證源數據的完整性且能成功導入,有時需關閉約束的校驗,保證數據能全部正確的導入當前庫,導入結束后再打開約束
- 數據庫約束有兩類狀態
啟用/禁用(enable/disable):是否對新變更的數據啟用約束驗證
驗證/非驗證(validate/novalidate):是否對表中已存在的數據進行約束驗證 - 這兩類四種狀態可以隨意組合,默認是 enable validate
- 組合以及含義如下:
enable validate:默認的約束組合狀態,無法添加違反約束的數據行,數據表中也不能存在違反約束的數據行
enable novalidate:無法添加違反約束的數據行,但對已存在的違反約束的數據行不做驗證
disable validate:可以添加違反約束的數據行,但對已存在的違反約束的數據行會做約束驗證(這是一種相互矛盾的約束組合,只不過是語法上支持這種組合罷了,結果是DML操作失敗)
disable novalidate:可以添加違法約束的數據行,對已存在的違反約束的數據行也不做驗證 - 例如:將表USER0402.STUDENT的SNAME字段的非空約束改為禁用非驗證狀態
ALTER TABLE USER0402.STUDENT MODIFY CONSTRAINT SYS_C0011125 DISABLE NOVALIDATE;
image.png
- 數據導入結束后,再將其狀態改為啟用非驗證,確保新添加的數據滿足要求,且不會驗證已有數據
ALTER TABLE USER0402.STUDENT MODIFY CONSTRAINT SYS_C0011125 ENABLE NOVALIDATE;
image.png