資料庫 觸發器

2021-07-23 04:47:36 字數 2539 閱讀 9120

觸發器的概念:

是使用者定義在關係表上的一類有事件驅動的特殊過程。一旦定義,任何對錶的增刪改操作均有伺服器自動啟用相應的觸發器,在dbms核心層進行集中的完整性控制。類似於約束,但比約束更靈活。

觸發器的分類:

dml觸發器:dml(data manipulation language)觸發器是當資料庫伺服器中發生資料操作語言事件時執行的儲存過程。dml觸發器又分為兩類:after觸發器和instead of觸發器

ddl觸發器:ddl觸發器是在響應資料定義語言(data definition language)事件時執行的儲存過程。ddl觸發器一般用於執行資料庫中管理任務。如審核和規範資料庫操作、防止資料庫表結構被修改等。

after觸發器:這類觸發器是在記錄已經改變完之後(after),才會被啟用執行,它主要是用於記錄變更後的處理或檢查,一旦發現錯誤,也可以用rollback transaction語句來回滾本次的操作。

instead of觸發器:這類觸發器一般是用來取代原本的操作,在記錄變更之前發生的,它並不去執行原來sql語句裡的操作(insert、update、delete),而去執行觸發器本身所定義的操作。

在sql server裡,每個dml觸發器都分配有兩個特殊的表,乙個是inserted表,乙個是deleted表。它們兩個存在於資料庫伺服器的記憶體中,是由系統管理的邏輯表,是兩個臨時表,而不是真正儲存在資料庫中的物理表。使用者對這兩個表只有讀取的許可權,沒有修改的許可權。

這兩個表的結構(主外來鍵、字段、資料型別等)與觸發器所在資料表的結構是完全一致的,當觸發器的工作完成之後,這兩個表也將會從記憶體中刪除。

定義觸發器:

使用create trigger命令建立觸發器,其一般格式為:

create trigcer 《觸發器名》

| before| after| 《觸發事件》on《表名》

for each | row| statement|

《觸發動作體》

1.觸發器名:可包含模式名,也可不包含,同一模式下,觸發器名必須是唯一的;並且觸發器名和《表名》

必須在同一模式下。

2.表名:表資料發生變化是,啟用定義在該錶上相應《觸發事件》的觸發器,也稱觸發器的目標表。

3。觸發事件:可以是insert ,delete .update,也可以是這幾個事件的組合。指明修改哪些列時觸發器

組合,可以是幾個事件的組合並且可以附加of 《觸發列》。

4.觸發器型別:行級觸發器(for each row),語句級觸發器(for each statement).

5.觸發條件:被啟用時,只有當觸發條件為真時觸發動作提才執行,如果省略when,則觸發動作體在觸

髮器啟用後立即執行

6.觸發動作體:是乙個匿名pl/sql過程塊,也可以是對已建立儲存過程的呼叫。

如果是行級觸發器,2中情況下都可以使用new/old引用,update/inser事件之後的新值和update/delete事件之前的舊值。如果是語句級觸發器,則不能在觸發動作體中使用new/old引用。

下面看一下例子:

定義乙個before行級觸發器,為教師表teacher定義完整性規則「教授的工資不得低於4000元,如果低於,就自動改為4000」

create trlgger insert_or_updata_sal   /*在教師表teacher上定義觸發器*/

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 行級觸發器,當教師表teacher的工資發生變化後自動在工資變化表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;

啟用觸發器:

執行表上的before觸發器;

啟用觸發器的sql語句;

執行該錶上的after觸發器。

刪除觸發器:

drop trigger《觸發器名》 on 《表名》;

資料庫觸發器

觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而 被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料...

資料庫觸發器

最近做了個觸發器的例子 create trigger tru user on user for update asif update status begin update user set stopflag 1 from inserted where user.userid inserted.us...

資料庫觸發器

想要某條語句在事件發生時自動執行 某錶發生改動時,自動處理 除下列三個關鍵字意外的不支援觸發器 建立觸發器時,需要給出四條資訊 create trigger newproduct after insert on products foreach rowselect product added 分析 ...