天天看點

mysql觸發器TRIGGER詳解

觸發器:

觸發器是與表有關的資料庫對象,在滿足定義條件時觸發,并執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在資料庫端確定資料的完整性。

應用場景:

假設我們有一個user表,需要在操作user表的時候做記錄,并備份user表的資料。這時我們可以使用觸發器完成我們的需求。

建立觸發器:

文法:

CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:觸發器的名稱
tirgger_time:觸發時機,為BEFORE或者AFTER
trigger_event:觸發事件,為INSERT、DELETE或者UPDATE
tb_name:表示建立觸發器的表明,就是在哪張表上建立觸發器
trigger_stmt:觸發器的程式體,可以是一條SQL語句或者是用BEGIN和END包含的多條語句
是以可以說MySQL建立以下六種觸發器:
BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
AFTER INSERT,AFTER DELETE,AFTER UPDATE
           

建立有多個語句的觸發器:

CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件
ON 表名 FOR EACH ROW
BEGIN
    執行語句清單
END
           

tips:

一般情況下,mysql預設是以 ; 作為結束執行語句,與觸發器中需要的分行起沖突

為解決此問題可用DELIMITER,如:DELIMITER #,可以将結束符号變成#

當觸發器建立完成後,可以用DELIMITER ;來将結束符号變成;

觸發器實際應用:

user表如下:

mysql觸發器TRIGGER詳解

需求:

新增一張表,當user表發生增删改的時候做記錄,并備份資料。

建立user_log表:

DROP TABLE IF EXISTS `user_log`;
CREATE TABLE `user_log` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `operation` varchar(64) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
           

建立觸發器:

DELIMITER $
CREATE TRIGGER user_log_insert AFTER INSERT ON user FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(64) character set utf8;#後面發現中文字元編碼出現亂碼,這裡設定字元集
SET s1 = "新增";
INSERT INTO user_log(operation,name) values(s1,NEW.name);#NEW 代表即将插入user表的資料
END $
DELIMITER ;
           

建立成功之後可以查詢一下是否有觸發器存在:

SHOW TRIGGERS
           
mysql觸發器TRIGGER詳解

上圖可見,觸發器建立成功。現在我們來試驗一下觸發器是否有用:

向user表插入一條資料看user_log表中是否會生成記錄:

INSERT INTO `user` (name) VALUES ('周傑倫');
           

查詢user表和user_log表結果如下:

mysql觸發器TRIGGER詳解
mysql觸發器TRIGGER詳解

由上圖可見,新增觸發器已經生效,成功記錄了user表的操作。

更新和删除觸發器同上,需要注意的是,每種觸發器中NEW 和OLD 代表的意思和使用方式:

mysql觸發器TRIGGER詳解

tips:

DELETE類型的觸發器隻有OLD,如果需要記錄删除前的資料,就可以使用OLD來擷取相應的屬性值。

DELETE觸發器:

DELIMITER $
CREATE TRIGGER user_log_delete AFTER DELETE ON user FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(64) character set utf8;#後面發現中文字元編碼出現亂碼,這裡設定字元集
SET s1 = "删除";
INSERT INTO user_log(operation,name) values(s1,OLD.name);#OLD 代表未删除之前user表的資料
END $
DELIMITER ;
           

删除user表的資料并驗證:

DELETE FROM `user` WHERE user_id = 1;
           

結果:

mysql觸發器TRIGGER詳解
mysql觸發器TRIGGER詳解

最後,如果不想再使用trigger可以删除:

DROP TRIGGER 觸發器名稱
           

總結:

觸發器是基于行觸發的,是以删除、新增或者修改操作可能都會激活觸發器,是以不要編寫過于複雜的觸發器,也不要增加過得的觸發器,這樣會對資料的插入、修改或者删除帶來比較嚴重的影響,同時也會帶來可移植性差的後果,是以在設計觸發器的時候一定要有所考慮。

觸發器是一種特殊的存儲過程,它在插入,删除或修改特定表中的資料時觸發執行,它比資料庫本身标準的功能有更精細和更複雜的資料控制能力。

資料庫觸發器有以下的作用:

1.安全性。可以基于資料庫的值使使用者具有操作資料庫的某種權利。

  # 可以基于時間限制使用者的操作,例如不允許下班後和節假日修改資料庫資料。

  # 可以基于資料庫中的資料限制使用者的操作,例如不允許股票的價格的升幅一次超過10%。

2.審計。可以跟蹤使用者對資料庫的操作。   

  # 審計使用者操作資料庫的語句。

  # 把使用者對資料庫的更新寫入審計表。

3.實作複雜的資料完整性規則

  # 實作非标準的資料完整性檢查和限制。觸發器可産生比規則更為複雜的限制。與規則不同,觸發器可以引用列或資料庫對象。例如,觸發器可回退任何企圖吃進超過自己保證金的期貨。

  # 提供可變的預設值。

4.實作複雜的非标準的資料庫相關完整性規則。觸發器可以對資料庫中相關的表進行連環更新。例如,在auths表author_code列上的删除觸發器可導緻相應删除在其它表中的與之比對的行。

  # 在修改或删除時級聯修改或删除其它表中的與之比對的行。

  # 在修改或删除時把其它表中的與之比對的行設成NULL值。

  # 在修改或删除時把其它表中的與之比對的行級聯設成預設值。

  # 觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行資料更新的事務。當插入一個與其主健不比對的外部鍵時,這種觸發器會起作用。例如,可以在books.author_code 列上生成一個插入觸發器,如果新值與auths.author_code列中的某值不比對時,插入被回退。

5.同步實時地複制表中的資料。

6.自動計算資料值,如果資料的值達到了一定的要求,則進行特定的處理。例如,如果公司的帳号上的資金低于5萬元則立即給财務人員發送警告資料。