溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2020-07-14 01:58:07 來源:網(wǎng)絡 閱讀:1111 作者:q381989042 欄目:數(shù)據(jù)庫

觸發(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 <表名>;

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI