您好,登錄后才能下訂單哦!
觸發(fā)器的概念:
是用戶定義在關系表上的一類有事件驅動的特殊過程。一旦定義,任何對表的增刪改操作均有服務器自動激活相應的觸發(fā)器,在DBMS核心層進行集中的完整性控制。類似于約束,但比約束更靈活。
觸發(fā)器的分類:
DML觸發(fā)器:DML(Data Manipulation Language)觸發(fā)器是當數(shù)據(jù)庫服務器中發(fā)生數(shù)據(jù)操作語言事件時執(zhí)行的存儲過程。DML觸發(fā)器又分為兩類:After觸發(fā)器和Instead Of觸發(fā)器
DDL觸發(fā)器:DDL觸發(fā)器是在響應數(shù)據(jù)定義語言(Data Definition Language)事件時執(zhí)行的存儲過程。DDL觸發(fā)器一般用于執(zhí)行數(shù)據(jù)庫中管理任務。如審核和規(guī)范數(shù)據(jù)庫操作、防止數(shù)據(jù)庫表結構被修改等。
After觸發(fā)器:這類觸發(fā)器是在記錄已經(jīng)改變完之后(after),才會被激活執(zhí)行,它主要是用于記錄變更后的處理或檢查,一旦發(fā)現(xiàn)錯誤,也可以用Rollback Transaction語句來回滾本次的操作。
Instead Of觸發(fā)器:這類觸發(fā)器一般是用來取代原本的操作,在記錄變更之前發(fā)生的,它并不去執(zhí)行原來SQL語句里的操作(Insert、Update、Delete),而去執(zhí)行觸發(fā)器本身所定義的操作。
在SQL Server里,每個DML觸發(fā)器都分配有兩個特殊的表,一個是Inserted表,一個是Deleted表。它們兩個存在于數(shù)據(jù)庫服務器的內(nèi)存中,是由系統(tǒng)管理的邏輯表,是兩個臨時表,而不是真正存儲在數(shù)據(jù)庫中的物理表。用戶對這兩個表只有讀取的權限,沒有修改的權限。
這兩個表的結構(主外鍵、字段、數(shù)據(jù)類型等)與觸發(fā)器所在數(shù)據(jù)表的結構是完全一致的,當觸發(fā)器的工作完成之后,這兩個表也將會從內(nèi)存中刪除。
定義觸發(fā)器:
使用CREATE TRIGGER命令建立觸發(fā)器,其一般格式為:
CREATE TRIGCER <觸發(fā)器名> | BEFORE| AFTER| <觸發(fā)事件>ON<表名> FOR EACH | ROW| STATEMENT| { WHEN <觸發(fā)條件>} <觸發(fā)動作體>
1.觸發(fā)器名:可包含模式名,也可不包含,同一模式下,觸發(fā)器名必須是唯一的;并且觸發(fā)器名和<表名>
必須在同一模式下。
2.表名:表數(shù)據(jù)發(fā)生變化是,激活定義在該表上相應<觸發(fā)事件>的觸發(fā)器,也稱觸發(fā)器的目標表。
3。觸發(fā)事件:可以是INSERT ,DELETE .UPDATE,也可以是這幾個事件的組合。指明修改哪些列時觸發(fā)器
組合,可以是幾個事件的組合并且可以附加OF <觸發(fā)列>。
4.觸發(fā)器類型:行級觸發(fā)器(FOR EACH ROW),語句級觸發(fā)器(FOR EACH STATEMENT).
5.觸發(fā)條件:被激活時,只有當觸發(fā)條件為真時觸發(fā)動作提才執(zhí)行,如果省略WHEN,則觸發(fā)動作體在觸
發(fā)器激活后立即執(zhí)行
6.觸發(fā)動作體:是一個匿名PL/SQL過程塊,也可以是對已創(chuàng)建存儲過程的調(diào)用。
如果是行級觸發(fā)器,2中情況下都可以使用NEW/OLD引用,UPDATE/INSER事件之后的新值和UPDATE/DELETE事件之前的舊值。如果是語句級觸發(fā)器,則不能在觸發(fā)動作體中使用NEW/OLD引用。
下面看一下例子:
定義一個BEFORE行級觸發(fā)器,為教師表Teacher定義完整性規(guī)則“教授的工資不得低于4000元,如果低于,就自動改為4000”
CREATE TRLGGER Insert_Or_Updata_Sal /*在教師表Teacher上定義觸發(fā)器*/ BEFORE INSERT OR UPDATE ON Teacher FOR EACH ROW AS BEGIN IF(new.Job = '教授') AND (new.Sal < 4000) THEN new.Sal : = 4000; END IF END;
定義AFTER 行級觸發(fā)器,當教師表Teacher的工資發(fā)生變化后自動在工資變化表Sal_log中增加一條相應記錄
CREATE TRLGGER Insert_Sal AFTER INSERT ON Teacher FOR EACH ROW AS BEGIN INSERT INTO Sal_log VALUES( new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP); END; CREATE TRLGGER Update_Sal AFTER UPDATE ON Teacher FOR EACH ROW AS BEGIN IF(new.Sal <> old.Sal) THEN INSERT INTO Sal_log VALUES( new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP); END IF; END;
激活觸發(fā)器:
執(zhí)行表上的BEFORE觸發(fā)器;
激活觸發(fā)器的SQL語句;
執(zhí)行該表上的AFTER觸發(fā)器。
刪除觸發(fā)器:
DROP TRIGGER<觸發(fā)器名> ON <表名>;
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。