Oracle - 數據庫對象


1 權限管理

權限性操作都要以 sysdba 什么來操作。

如何創建一個用戶並授予一定權限?

 1 --創建用戶
 2 create user test01 identified by 123
 3 
 4 -- 查看是否創建成功
 5 select * from dba_users
 6 where username = 'TEST01';
 7 
 8 -- 授權登錄(會話)權限
 9 grant create session to test01;
10 
11 -- 默認用戶沒有任何表,而且不具備操作其他表的權限。
12 --select * from emp;
13 
14 -- 授權 soctt.emp 所有權限(all)給 test01,在此之后 test01 可以對 scott 下的 emp 表操作
15 grant all on scott.emp to test01;
16 -- 回收權限
17 revoke all on scott.emp from test01;
18 
19 -- 分配創建表的權限
20 grant create table to test01;
21 
22 -- 此時 test01 用戶可以建表,可以 select,但不能 insert 數據,需要給予表空間
23 grant unlimited tablespace to test01;
24 
25 -- 修改用戶密碼
26 alter user test01 identified by 1234;
27 
28 -- 級聯刪除用戶
29 drop user test01 cascade;
30 
31 -- 查看用戶權限
32 select * from user_sys_privs;

2 視圖

視圖(view),稱為虛表,在數據庫中不存在實體。視圖本質上是對物理表(基表)的一種數據保護,讓開發者或者用戶只能看到基表中的部分數據。

2.1 創建視圖

1 create or replace view v$empinfo as
2 select e.empno,e.ename,e.job,e.mgr,e.hiredate,e.deptno
3 from emp e;
4 
5 --還可以創建只讀視圖
6 create or replace view v$empinfo as
7 select e.empno,e.ename,e.job,e.mgr,e.hiredate,e.deptno from emp e
8 with read only;

2.2 使用視圖

在使用視圖時,可以把視圖當作一個表來使用。

1 -- 使用視圖
2 select * from v$empinfo;
3 
4 -- 刪除視圖
5 drop view v$empinfo;
6 
7 -- 向視圖添加數據
8 insert into v$empinfo(empno,ename,job,mgr,hiredate,deptno)
9 values(1090,'cai90','singer',7839,sysdate,30);

通過視圖添加數據,數據最終添加到基本中,因為視圖是虛表。視圖一般只是基表的部分數據,通過視圖向基表添加數據時,基本的數據只能添加一部分,此時基表會對未提供的字段置null。如果基表對未提供的字段要求不能為null,此次添加會失敗。

1 -- 刪除數據
2 delete from v$empinfo where empno = 1090
3 
4 -- 更新數據
5 update v$empinfo set comm = 20
6 where empno = 1080

3 表

數據庫數據類型

  • number(x,y) - 數值型,最長是x位,y位小數
  • varchar2(maxlength) - 變長字符串,maxlength這個參數的上限是32767字節
  • char(max_length) - 定長字符串,最大2000字節
  • Date - 日期時間,只能精確到秒。
  • timestamp - 時間戳,精確到微秒
  • long - 長字符串,最大支持2GB

其他類型:

  • CLOB - 大文件,最大長度4G
  • BLOB - 存二進制文件
在數據庫設計時,如果要存大文件(視頻,音頻等),一定不要用BLOB/CLOB,通用的解決方案都是文件的地址。

3.1 表的創建

創建表的語法

1 CREATE TABLE [schema.]table(
2 column datatype [DEFAULT expr] , …
3 );

例如直接創建一個學生表

1 create table t_stuinfo(
2    sid number(4),
3    name varchar2(20),
4    phone char(11),
5    gender number(1),
6    birthday date,
7    address varchar2(100)
8 );

通過子查詢結果創建表

1 -- 通過其他表結構創建表
2 create table t_emp
3 as 
4 select * from emp;
5 
6 -- 只創建表的結構(復制表結構)
7 create table t_emp2
8 as
9 select * from emp where 1=2;

3.2 表的修改

對表的屬性修改

 1 -- [1]給表添加字段
 2 alter table t_stuinfo add grade number(2)
 3 
 4 -- [2]刪除表的字段
 5 alter table t_stuinfo drop column grade 
 6 
 7 -- [3] 修改表字段屬性
 8 alter table t_stuinfo modify(address varchar2(150))
 9 
10 -- [4]重命名
11 rename t_stuinfo to t_stuinfo2

對表的內容修改

  • insert - 添加行
1 insert into t_emp2(empno,ename,job,mgr,hiredate,sal,comm,deptno)
2 values(1010,'cai10','singer',7938,sysdate,1000,1,10);
3 -- insert是事務操作,需要提交事務。
4 
5 -- 按順序添加可忽略字段名
6 insert into t_emp2
7 values(1020,'cai20','singer',7938,sysdate,2000,2,10);
  • update - 修改表數據
1 update t_emp2
2 set ename = 'cai22',sal = 2200
3 where empno = 1020;
  • delete - 刪除行
1 delete from t_emp2
2 where empno = 1010;
3 
4 --刪除表中的所有數據-沒有事務-速度快
5 truncate table t_emp2;

4 序列

序列是oracle專有的對象,它用來產生一個自動遞增的數列。在數據庫開發設計表時,如果需要一個字段的值是自增的話,優先考慮序列。

1 -- 創建序列
2 create sequence seq_empno
3 start with 1       --初始值
4 increment by 1;    --增量
5 
6 -- 序列中的下一個值,從定義(start with)的值開始,調用了 nextval 之后, currval 會變成 nextval 的值
7 select seq_empno.nextval from dual;
8 -- 獲取序列的當前值
9 select seq_empno.currval from dual;

5 事務

5.1 概念

事務(Transaction)是一個操作序列。這些操作要么都做,要么都不做,是一個不可分割的工作單位,是數據庫環境中的邏輯工作單位。事務是為了保證數據庫的完整性。

在 oracle 中,沒有事務開始的語句。一個 Transaction 起始於一條 DML (Insert、Update和Delete )語句,結束於以下的幾種情況:

  1. 用戶顯式執行 Commit 語句提交操作或 Rollback 語句回退。
  2. 當執行 DDL(Create、Alter、Drop) 語句事務自動提交。
  3. 用戶正常斷開連接時,Transaction 自動提交。
  4. 系統崩潰或斷電時事務自動回退。

5.2 保存點(save point)

可以在事務中添加保存點,再通過 rollback sp 的方式回滾到保存點的位置再提交事務,保留有效的工作進度。

 1 -- beginTrans
 2 insert into t_emp2 values(9,'cai40','singer',7938,sysdate,4000,4,10);
 3 insert into t_emp2 values(10,'cai50','singer',7938,sysdate,5000,5,10);
 4 select * from t_emp2;
 5 
 6 savepoint sp1;
 7 
 8 insert into t_emp2 values(11,'cai40','singer',7938,sysdate,4000,4,10);
 9 insert into t_emp2 values(12,'cai50','singer',7938,sysdate,5000,5,10);
10 select * from t_emp2;
11 
12 rollback to sp1;
13 
14 commit;

5.3 事務的特性

事務四大特征:原子性,一致性,隔離性和持久性。

  • 原子性(Atomicity)

一個原子事務要么完整執行,要么干脆不執行。這意味着,工作單元中的每項任務都必須正確執行。如果有任一任務執行失敗,則整個工作單元或事務就會被終止。即此前對數據所作的任何修改都將被撤銷。如果所有任務都被成功執行,事務就會被提交,即對數據所作的修改將會是永久性的。

  • 一致性(Consistency)

一致性代表了底層數據存儲的完整性。它必須由事務系統和應用開發人員共同來保證。事務系統通過保證事務的原子性,隔離性和持久性來滿足這一要求; 應用開發人員則需要保證數據庫有適當的約束(主鍵,引用完整性等),並且工作單元中所實現的業務邏輯不會導致數據的不一致(即,數據預期所表達的現實業務情況不相一致)。例如,在一次轉賬過程中,從某一賬戶中扣除的金額必須與另一賬戶中存入的金額相等。支付寶賬號100 你讀到余額要取,有人向你轉100 但是事物沒提交(這時候你讀到的余額應該是100,而不是200) 這種就是一致性

  • 隔離性(Isolation)

隔離性意味着事務必須在不干擾其他進程或事務的前提下獨立執行。換言之,在事務或工作單元執行完畢之前,其所訪問的數據不能受系統其他部分的影響。

  • 持久性(Durability)

持久性表示在某個事務的執行過程中,對數據所作的所有改動都必須在事務成功結束前保存至某種物理存儲設備。這樣可以保證,所作的修改在任何系統癱瘓時不至於丟失。

6 約束

當我們創建表的時候,同時可以指定所插入數據的一些規則,比如說某個字段不能為空值,某個字段的值(比如年齡)不能小於零等等,這些規則稱為約束。約束是在表上強制執行的數據校驗規則。

常見約束:

  1. NOT NULL 非空
  2. UNIQUE Key 唯一鍵
  3. PRIMARY KEY 主鍵
  4. FOREIGN KEY 外鍵
  5. CHECK 自定義檢查約束

6.1 主鍵約束

主鍵用於唯一標識一條記錄。主鍵值不可為空,也不允許出現重復。

 1 -- 創建列級約束-顯式指定名稱,pk_sid
 2 create table t_stuInfo(
 3      sid number(4) [constraint pk_sid] primary key,    --約束規則名可以省略
 4      name varchar2(20)
 5 );
 6 
 7 
 8 -- 當對多個字段進行約束的時候(除了非空約束,其它約束都可以采用這種方式,也只有這種方式可以選擇兩個主鍵)
 9 create table t_stuInfo3(
10    sid number(4),
11    phone char(11),
12    name varchar2(20),
13    [constraint pk_stuinfo] primary key(phone,name)
14 );

6.2 非空約束

確保字段值不允許為空,只能在列級定義。

1 create table t_stuInfo5(
2      sid number(4) primary key,
3      phone char(11) [constraint nn_phone] not null
4 );

6.3 唯一性約束

唯一性約束條件確保所在的字段或者字段組合不出現重復值,唯一性約束條件的字段允許出現空值,但只能出現一個。Oracle將為唯一性約束條件創建對應的唯一性索引。

1 create table t_stuInfo6(
2      sid number(4) primary key,
3      phone char(11) [constraint uq_phone] unique 
4 );

6.4 自定義約束

Check約束用於對一個屬性的值通過特定條件加以限制。

 1 -- 不顯示設定約束名
 2 create table t_stuInfo7(
 3      sid number(4) primary key,
 4      phone char(11) unique,
 5      age number(3) check(age>0 and age<100)
 6 );
 7 
 8 -- 顯示設定約束
 9 create table emp3(
10      id number(4) primary key,
11     age number(2)  check(age > 0 and age < 100),
12     salary number(7,2),
13     sex char(1),
14     constraint salary_check check(salary > 0)
15 );

6.5 外鍵約束

當表中的某個字段和另外一個表的主鍵字段相互關聯時,可以設定外鍵約束。從鍵受主鍵的約束,只能設為主鍵中擁有的值。

1 create table t_stuInfo8(
2      sid number(4) primary key,
3      phone char(11) unique,
4      tid number(4),
5      constraint fk_tid foreign key(tid) references t_teacher1(tid)
6 );

對於主表的刪除和修改主鍵值的操作,會對依賴關系產生影響,以刪除為例:當要刪除主表的某個記錄,即刪除一個主鍵值,那么對依賴的影響可采取下列3種做法:

  1. RESTRICT方式:只有當依賴表中沒有一個外鍵值與要刪除的主表中主鍵值相對應時,才可執行刪除操作。
  2. CASCADE方式:將依賴表中所有外鍵值與主表中要刪除的主鍵值相對應的記錄一起刪除
  3. SET NULL方式:將依賴表中所有與主表中被刪除的主鍵值相對應的外鍵值設為空值

可以在建表時對外鍵約束的刪除規則進行設定,若不加以設定,默認采用第一種方式。

1 --FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) [ON DELETE [CASCADE|SET NULL]]
2 -- cascade 的例子
3 create table t_stuInfo8(
4      sid number(4) primary key,
5      phone char(11) unique,
6      tid number(4),
7      constraint fk_tid foreign key(tid) references t_teacher1(tid) on DELETE CASCADE
8 );


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM