SQLServerDML觸發器之AFTER觸發器

來源:互聯網
上載者:User

   根據DML觸發器發生的時間、編寫觸發器所使用的語言,可以分為AFTER觸發器、INSTEAD OF觸發器和CLR觸發器。AFTER觸發器在執行INSERT、UPDATE或DELETE語句操作之後、INSTEAD OF觸發器和約束之後激發。INSTEAD OF在處理約束前激發,因此可以在INSTEAD OF中使用其他語句來替代激發觸發器的INSERT、UPDATE等語句。並且,還可為基於一個或多個基表的視圖定義INSTEAD OF觸發器,從而擴充視圖可支援的更新類型。CLR觸發器可以是AFTER觸發器或INSTEAD OF觸發器,並且也可以是DDL觸發器。

  需要注意的是,在建立DML觸發器時,不能使用下列語句:

  ALTER DATABASE CREATE DATABASE DROP DATABASE

  LOAD DATABASE LOAD LOG RECONFIGURE

  RESTORE DATABASE RESTORE LOG

  14.1.1 AFTER觸發器

  一個表中可以具有多個AFTER觸發器,只要它們的名稱不相同即可。每個觸發器只能應用於一個表,但是一個觸發器可以同時應用於一個表的三個使用者操作(UPDATE、INSERT和DELETE)。

  下面的語句建立了一個PriTrigger表和一個DetailTable,其中PriTrigger表用於存放銷售訂單的編號和金額,DetailTable表用於存放每筆訂單中的產品資訊。為PriTrigger表的DELETE操作建立了一個名為PriTrigger的觸發器,當刪除PriTrigger表中的訂單資訊時,該觸發器將刪除DetailTable表中該筆訂單的產品資訊。

  USE AdventureWorks;

  GO

  -- 建立主表,存放銷售訂單編號和金額

  CREATE TABLE PriTable

  (OrderID int IDENTITY(1,1), OrderTotal money);

  GO

  -- 建立明細表,存放每筆訂單中的產品資訊

  CREATE TABLE DetailTable

  (OrderID int, ProductID int, ProductCount int NOT NULL, Price money);

  GO

  -- 向主表中插入訂單資訊

  INSERT INTO PriTable VALUES (2100.00);

  INSERT INTO PriTable VALUES (1000.00);

  -- 向明細表中插入訂單的產品資訊

  INSERT INTO DetailTable VALUES (1,1,10,110.00);

  INSERT INTO DetailTable VALUES (1,2,10,100.00);

  INSERT INTO DetailTable VALUES (2,2,10,100.00);

  GO

  -- 為PriTrigger表建立觸發器

  CREATE TRIGGER PriTrigger

  ON PriTable

  AFTER DELETE

  AS

  DELETE FROM DetailTable

  WHERE OrderID IN (SELECT OrderID

  FROM Deleted);

  PRINT N'已經刪除了DetailTable表中的相關資料' -- 此句僅為示範需要,在觸發器中不應當使用這樣的資訊語句

  在定義觸發器時,觸發器名稱在CREATE TRIGGER關鍵字之後,ON子句指定要建立觸發器的基表。AFTER子句(也可以使用FOR來代替AFTER關鍵字,二者功能相同)指定啟用觸發器的動作陳述式,可以同時指定多個動作陳述式。例如,“AFTER DELETE, INSERT”表示在對錶執行DELETE、INSERT語句時啟用觸發器。AS關鍵字後指定觸發器執行什麼樣的操作。

  注意WHERE條件中IN子句中的Deleted關鍵字。當從PriTrigger表中刪除行時,被刪除的行會被複製到一個名為Deleted的臨時記憶體表中。如果為表指定了一個執行INSERT語句時的觸發器,則在向表中插入行時,新行將同時被添加到一個名為Inserted的臨時記憶體表中。如果為表指定了一個執行UPDATE語句時的觸發器,由於更新事務類似於在刪除操作之後執行插入操作。因此,舊行被複製到Deleted表中,然後,新行被複製到觸發器表和Inserted表中。

  Deleted表和Inserted表都是由SQL Server自動建立和管理的,這些表的結構與定義觸發器的基表的結構相同。

  執行下面的語句從PriTable表中刪除OrderID為1的行,這時觸發器會自動刪除DetailTable表中的相關行,得到的結果和訊息如圖14-1所示。

  DELETE FROM PriTable WHERE OrderID = 1;

  SELECT * FROM PriTable;

  SELECT * FROM DetailTable;

  圖14-1 刪除PriTable表中OrderID為1的行時得到的結果和訊息

  如果執行下面的語句,準備從PriTable表中刪除OrderID為3的行。由於PriTable表中並不存在這樣的行,所以並不會刪除成功。雖然沒有刪除成功,但是在訊息視窗中仍然可以看到由觸發器的PRINT語句發回的資訊。這說明即使語句沒有影響到表中的行,也會啟用觸發器。在沒有刪除成功的情況下,Deleted表是一個空表。

  DELETE FROM PriTable WHERE OrderID = 3;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.