日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

11、oracle数据库下的事务和触发器

發布時間:2023/12/3 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11、oracle数据库下的事务和触发器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ORACLE下的事務和觸發器

1.事務

事務是數據庫的一種機制,當執行一系列操作時,事務可以保證這一系列操作都能完成,在此期間如果出現問題,則這一系列操作導致的結果均回退到原始狀態。這樣就保證了數據的一致性,事務在數據庫種是極其重要的。

1.1 事務的特點

事務的特點簡單說就是ACID。原子性,組成事務處理的語句是一個整體,不能只執行其中的一部分;一致性,在事務執行前后,數據庫是一致的;隔離性,一個事務處理對另一個事務處理的影響;持續性:事務處理的效果會被永久保存下來。一個事務只會有一個結果,要么都執行,要么都不執行。

1.2 事務的提交和回滾

Oracle種使用commit和roolback來控制事務的提交和回滾。這里有一個保存點的概念,意思是可以通過創建保存點的方式指定事務回退的“點”。如下實例:

-- 創建保存點1

savepoint a1;

-- 執行sql操作
update user set name='' where id = 1;

-- 創建保存點2
savepoint a2

-- 執行sql操作
delete user where id = 2;

-- 如果出問題了,回滾到保存點2

Roolback to a2;

-- 提交(提交之后是無法回滾的)
commit;

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数据库下的事务和触发器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。