11、oracle数据库下的事务和触发器
ORACLE下的事務(wù)和觸發(fā)器
1.事務(wù)
事務(wù)是數(shù)據(jù)庫的一種機制,當(dāng)執(zhí)行一系列操作時,事務(wù)可以保證這一系列操作都能完成,在此期間如果出現(xiàn)問題,則這一系列操作導(dǎo)致的結(jié)果均回退到原始狀態(tài)。這樣就保證了數(shù)據(jù)的一致性,事務(wù)在數(shù)據(jù)庫種是極其重要的。
1.1 事務(wù)的特點
事務(wù)的特點簡單說就是ACID。原子性,組成事務(wù)處理的語句是一個整體,不能只執(zhí)行其中的一部分;一致性,在事務(wù)執(zhí)行前后,數(shù)據(jù)庫是一致的;隔離性,一個事務(wù)處理對另一個事務(wù)處理的影響;持續(xù)性:事務(wù)處理的效果會被永久保存下來。一個事務(wù)只會有一個結(jié)果,要么都執(zhí)行,要么都不執(zhí)行。
1.2 事務(wù)的提交和回滾
Oracle種使用commit和roolback來控制事務(wù)的提交和回滾。這里有一個保存點的概念,意思是可以通過創(chuàng)建保存點的方式指定事務(wù)回退的“點”。如下實例:
| -- 創(chuàng)建保存點1 savepoint a1; -- 執(zhí)行sql操作 -- 創(chuàng)建保存點2 -- 執(zhí)行sql操作 -- 如果出問題了,回滾到保存點2 Roolback to a2; -- 提交(提交之后是無法回滾的) |
1.3事務(wù)提交前后的數(shù)據(jù)可見性
事務(wù)提交前,改變前的數(shù)據(jù)狀態(tài)是可以恢復(fù)的,執(zhí)行DML操作的用戶可以通過SELECT 語句查詢之前的修正,其他用戶看不到當(dāng)前用戶所做的改變,直到當(dāng)前用戶結(jié)束事務(wù),也就是提交事務(wù)。
事務(wù)提交后,數(shù)據(jù)的改變已經(jīng)被保存到數(shù)據(jù)庫中,改變前的數(shù)據(jù)已經(jīng)丟失,所有用戶可以看到結(jié)果,所有保存點被釋放。一經(jīng)提交,無法恢復(fù)。
2.觸發(fā)器
觸發(fā)器是一個與表相關(guān)聯(lián)的、存儲的PL/SQL程序,每當(dāng)一個DML語句在表上發(fā)生時,oracle會自動執(zhí)行觸發(fā)器中的語句序列,觸發(fā)器是在執(zhí)行DML語句時,自動調(diào)用的。觸發(fā)器可用于數(shù)據(jù)確認(rèn)、實施復(fù)雜的安全性檢查、跟蹤表上的所有數(shù)據(jù)操作、數(shù)據(jù)的備份和同步等。
2.1 觸發(fā)器的類型
觸發(fā)器有兩種類型:語句級觸發(fā)器、行級觸發(fā)器(FOR EACH ROW)
2.2 觸發(fā)器的解釋
觸發(fā)器這個組件,我覺得可以稱作為組件,光憑概念去理解可能會很抽象,通俗易懂的說觸發(fā)器就相當(dāng)于是一個監(jiān)聽器,當(dāng)對表執(zhí)行DML語句時,如果指定的對象上添加了觸發(fā)器,則會執(zhí)行觸發(fā)器所定義的動作,我目前所認(rèn)識的觸發(fā)器指定定義到指定表上,接下來看幾個例子理解一下。
2.3 觸發(fā)器的應(yīng)用
創(chuàng)建一個行級觸發(fā)器,當(dāng)更新數(shù)據(jù)表種記錄時,將會執(zhí)行打印“update table”的動作:
| Create or replace trigger trigger1 ???Before update ???On person for each row ???Decclare ???Begin ?????Dbms_output.put_line(“update table”); End; |
觸發(fā)器中有:OLD和:NEW兩個聲明,意思是獲取到制定操作之前對應(yīng)行數(shù)據(jù)的舊值和新值,可以針對insert、update、delete操作進行修飾,不過需要注意的是,綁定到insert操作上的觸發(fā)器中不能使用:OLD,綁定到delete操作上的觸發(fā)器不能使用:NEW。可以思考一下為什么不能用。(insert之前有舊值么?)
好了,理論說了一大堆,下邊寫幾個歷史上用來做觸發(fā)器入門的例子吧。
| -- 在person表上添加行級觸發(fā)器,用來監(jiān)聽插入之前的操作,禁止開頭為A的名字添加到person表 Create or replace trigger t1 Before insert on person for each row Begin ??Dbms_output.put_line(‘hello’||:NEW.id||:NEW.name); ??If :NEW.name like ‘A%’?then ?????Raise_APPLICATION_ERROR(-20000,’不允許寫入以A開頭的 名字’); ??End if; End; ? -- 驗證操作 Set serveroutput on; Insert into person values(‘id’,’ABC’); ?-- 禁止插入,提示錯誤信息 ? |
| -- 限制修改的年齡大于之前的年齡 Create or replace trigger t2 Before update on user for each row Begin ??If :NEW.age < :OLD.age then ?????-- 提示錯誤信息 ??End if; End; |
| -- 同時添加insert、update、delete三種類型操作對應(yīng)的觸發(fā)器 Crete or replace trigger t3 Before insert or update or delete on user Declare Begin ???-- 操作 End; |
| 查看創(chuàng)建了哪些觸發(fā)器: SELECT * FROM USER_TRIGGERS |
總結(jié)
以上是生活随笔為你收集整理的11、oracle数据库下的事务和触发器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梁洁个人资料简介 梁洁个人介绍
- 下一篇: iphone锁屏一直显示未在播放