1. 程式人生 > 資訊 >美 FCC 盯上華為、海康威視等五家公司監控攝像頭,稱這些產品存在安全擔憂

美 FCC 盯上華為、海康威視等五家公司監控攝像頭,稱這些產品存在安全擔憂

定義

觸發器是在資料庫中,在執行對資料有異動的動作時,先行攔截並處理的一種資料庫物件,它大部分會設在資料表中,作為強制執行特定動作的程式,因此又稱為資料庫操縱語言(DML)觸發器。

優點

  1. 可在寫入資料前,強制檢驗或轉換資料
  2. 觸發程式發生錯誤時,異動的結果會被撤銷

種類

  1. BEFORE:在異動發生前執行
  2. AFTER:在異動發生後執行
  3. INSTEAD OF:替換異動的指令

語法

CREATE TRIGGER<>

{BEFORE | AFTER} <觸發事件> ON <表名>

REFERENCING NEW|OLD ROW AS <變數>

FOR EACH {ROW | STATEMENT}

[WHEN <觸發條件>]<觸發動作體>

注意:觸發器只能定義在基本表上,不能定義在檢視上

觸發器型別

行級觸發器(FOR EACH ROW):觸發器發生的次數與表的行數有關

語句級觸發器(FOR EACH STATEMENT):觸發動作只發生一次

舉個例子

當對錶SC的Grade屬性進行修改時,若分數增加了10%則將此次操作記錄到下面表中: SC_U(Sno,Cno,Oldgrade,Newgrade) 其中Oldgrade是修改前的分數,Newgrade是修改後的分數。
CREATE TRIGGER SC_T
AFTER UPDATE OF Grade ON
SC REFERENCING OLD row AS OldTuple, NEW row AS NewTuple FOR EACH ROW WHEN (NewTuple.Grade >= 1.1*OldTuple.Grade) INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade) VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)

課後習題

1.建設之前建立的course表沒有定義外來鍵級聯策略,建立觸發器,實現在course表中刪除課程資訊時,可自動刪除該課程在SC表上的成績資訊。

思路:

通過上面關於觸發器的基礎知識的瞭解,我們很容易寫出這道問題的程式碼的基本框架

CREATE TRIGGER deleteScore
AFTER DELETE ON course
FOR EACH ROW
BEGIN
    ......
END

這裡我們首先使用的是行級觸發器,因為這道問題比較簡單,所以就沒有寫觸發動條件,觸發動作體在觸發器啟用後立即執行。現在我們要解決的是應該怎麼來實現觸發動作體,因為我們使用的是行級觸發器,可以在過程體中使用NEW和OLD引用事件之後的新值和事件之前的舊值。在不同的觸發器中NEW和OLD的含義各不相同

mysql觸發器中, NEW關鍵字,和 MS SQL Server 中的 INSERTED 和 DELETED 類似,MySQL 中定義了 NEW 和 OLD,用來表示觸發器的所在表中,觸發了觸發器的那一行資料。

具體地:
在 INSERT 型觸發器中,NEW 用來表示將要(BEFORE)或已經(AFTER)插入的新資料;
在 UPDATE 型觸發器中,OLD 用來表示將要或已經被修改的原資料,NEW 用來表示將要或已經修改為的新資料;
在 DELETE 型觸發器中,OLD 用來表示將要或已經被刪除的原資料;
使用方法: NEW.columnName (columnName 為相應資料表某一列名)
另外,OLD 是隻讀的,而 NEW 則可以在觸發器中使用 SET 賦值,這樣不會再次觸發觸發器,造成迴圈呼叫。
————————————————
版權宣告:本文為CSDN博主「問就是啥也不是」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/bcfdsagbfcisbg/article/details/78338434

執行前

執行後