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