數(shù)據(jù)庫:觸發(fā)器

觸發(fā)器的概念:

創(chuàng)新互聯(lián)建站于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站制作、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元東烏珠穆沁做網(wǎng)站,已為上家服務(wù),為東烏珠穆沁各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

    是用戶定義在關(guān)系表上的一類有事件驅(qū)動的特殊過程。一旦定義,任何對表的增刪改操作均有服務(wù)器自動激活相應(yīng)的觸發(fā)器,在DBMS核心層進行集中的完整性控制。類似于約束,但比約束更靈活。

觸發(fā)器的分類:

DML觸發(fā)器:DML(Data Manipulation Language)觸發(fā)器是當(dāng)數(shù)據(jù)庫服務(wù)器中發(fā)生數(shù)據(jù)操作語言事件時執(zhí)行的存儲過程。DML觸發(fā)器又分為兩類:After觸發(fā)器和Instead Of觸發(fā)器

DDL觸發(fā)器:DDL觸發(fā)器是在響應(yīng)數(shù)據(jù)定義語言(Data Definition Language)事件時執(zhí)行的存儲過程。DDL觸發(fā)器一般用于執(zhí)行數(shù)據(jù)庫中管理任務(wù)。如審核和規(guī)范數(shù)據(jù)庫操作、防止數(shù)據(jù)庫表結(jié)構(gòu)被修改等。

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ù)庫服務(wù)器的內(nèi)存中,是由系統(tǒng)管理的邏輯表,是兩個臨時表,而不是真正存儲在數(shù)據(jù)庫中的物理表。用戶對這兩個表只有讀取的權(quán)限,沒有修改的權(quán)限。

這兩個表的結(jié)構(gòu)(主外鍵、字段、數(shù)據(jù)類型等)與觸發(fā)器所在數(shù)據(jù)表的結(jié)構(gòu)是完全一致的,當(dāng)觸發(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ā)生變化是,激活定義在該表上相應(yīng)<觸發(fā)事件>的觸發(fā)器,也稱觸發(fā)器的目標(biāo)表。

3。觸發(fā)事件:可以是INSERT ,DELETE .UPDATE,也可以是這幾個事件的組合。指明修改哪些列時觸發(fā)器

組合,可以是幾個事件的組合并且可以附加OF <觸發(fā)列>。

4.觸發(fā)器類型:行級觸發(fā)器(FOR EACH ROW),語句級觸發(fā)器(FOR EACH STATEMENT).

5.觸發(fā)條件:被激活時,只有當(dāng)觸發(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ā)器,當(dāng)教師表Teacher的工資發(fā)生變化后自動在工資變化表Sal_log中增加一條相應(yīng)記錄

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 <表名>;

本文題目:數(shù)據(jù)庫:觸發(fā)器
本文URL:http://muchs.cn/article36/pgoesg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)網(wǎng)站建設(shè)、建站公司響應(yīng)式網(wǎng)站、品牌網(wǎng)站設(shè)計、網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計