資料庫觸發器相關(以mysql為例)

2021-07-27 10:14:00 字數 1805 閱讀 7719

一.觸發器概述

觸發器是乙個被置頂關聯到乙個表的資料庫物件,當對乙個表的特定事件出現時,它將會被啟用。觸發器簡而言之就是在特定事件發生時會被觸發從而達到管理者想要的效果。

例如:每當客戶訂購乙個產品時,都從產品庫存量中減去訂購的數量。

無論何時刪除一行,都會在資料庫的存檔表中保留乙個副本。

二.建立觸發器

語法格式:

create trigger name time event

on tb_name for each row body

語法說明如下:

name:觸發器的名稱,觸發器在當前資料庫必須有唯一的名稱, 如果要在某個特定資料庫中建立, 名稱前應加上資料庫的名稱

time 觸發器被觸發的時刻有before和after兩個選項。用於表示觸發器是在啟用它的語句之前或者之後觸發

如果希望驗證新資料是否滿足使用的限制, 則通常使用before觸發

如果希望在觸發之後完成幾個乃至更多的改變,則通常使用after觸發

event 觸發事件, 用於指定啟用觸發器的語句的種類。 目前mysql觸發種類只有insert, update, delete三種。

tb_name 與觸發器相關聯的表名,必須引用永久性表,不能將觸發器與臨時表或檢視關聯起來

for each row 這個宣告用來指定對於受觸發事件影響的每一行都要啟用觸發器的動作。如使用insert向表中插入多條記錄時,觸發器對於每一行記錄都會觸發執行

body 觸發器動作主體,包含觸發器啟用時要執行的mysql語句。

舉例:如圖所示在takes表上定義乙個update觸發器,當takes表中元組的屬性grade被更新時,意味著學生上的這麼課的課程成績被更新,需要用觸發器維護student裡元組的tot_cred屬性,使其獲得的總學分保持實時更新。只有當屬性grade從空值或者』f』被更新為代表課程已經完成的具體分數時,觸發器才會被激發。

delimiter 

create trigger credit_get after update

on takes for each row

begin

if (new.grade <> 'f' and new.grade is not null

and (old.grade = 'f' or old.grade is null))

then

update student

set tot_cred = tot_cred +

(select credits

from course

where course.course_id = new.course_id)

where student.id = new.id;

end if;

end;

三.檢視觸發器

如需在資料庫中檢視已存在的觸發器,可以使用如下語句

show triggers [from|in database.name]

四.刪除觸發器

drop trigger [if exists] [database.name] trigger_name

五. 關於觸發器的進一步說明

與其他dbms相比,目前mysql版本所支援的觸發器還比較低階,未來肯定會有所改進

建立觸發器可能需要特殊的安全訪問許可權,但是觸發器的執行是自動的,也就是說如果insert, delete, 或update可以執行,那麼觸發器也可正常工作

應該多用觸發器來保證資料的一致性,完整性和正確性。

觸發器有一種十分有意義的使用模式——建立審計跟蹤,即可以使用觸發器將表的更改狀態以及之前和之後的狀態記錄到另外一張資料表中。

資料庫 MySQL觸發器

觸發器 trigger 監視某種情況,並觸發某種操作。觸發器建立語法四要素 1.監視地點 table 2.監視事件 insert update delete 3.觸發時間 after before 4.觸發事件 insert update delete 語法 create trigger trigg...

九 資料庫mysql觸發器

9.1觸發器作用 當操作了某張表時,希望同時觸發一些動作 行為,可以使觸發器完成!例如 當向員工表插入一條記錄時,希望同時往日誌表插入資料 select from emp create table test log id int primary key auto increment,content ...

mysql資料庫的觸發器 Mysql資料庫觸發器

我還是msyql資料庫觸發器的新手.我想問一下我的台詞 create trigger secure dml3 before delete on t pembelian begin if select to char sysdate,dy in sun or select to char sysdat...