首頁 資料庫 mysql教程 SQLServerDML触发器之AFTER触发器

SQLServerDML触发器之AFTER触发器

Jun 07, 2016 pm 04:19 PM
after 觸發器

根据DML触发器发生的时间、编写触发器所使用的语言,可以分为AFTER触发器、INSTEAD OF触发器和CLR触发器。AFTER触发器在执行INSERT、UPDATE或DELETE语句操作之后、INSTEAD OF触发器和约束之后激发。INSTEAD OF在处理约束前激发,因此可以在INSTEAD OF中使用

   根据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;

SQLServerDML触发器之AFTER触发器   三联

  图14-1 删除PriTable表中OrderID为1的行时得到的结果和消息

  如果执行下面的语句,准备从PriTable表中删除OrderID为3的行。由于PriTable表中并不存在这样的行,所以并不会删除成功。虽然没有删除成功,但是在消息窗口中仍然可以看到由触发器的PRINT语句发回的信息。这说明即使语句没有影响到表中的行,也会激活触发器。在没有删除成功的情况下,Deleted表是一个空表。

  DELETE FROM PriTable WHERE OrderID = 3;

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
如何隱藏文字直到在 Powerpoint 中單擊 如何隱藏文字直到在 Powerpoint 中單擊 Apr 14, 2023 pm 04:40 PM

如何在 PowerPoint 中的任何點擊之前隱藏文本如果您希望在單擊 PowerPoint 幻燈片上的任意位置時顯示文本,那麼設置起來既快速又容易。若要在 PowerPoint 中按一下任何按鈕之前隱藏文字:開啟您的 PowerPoint 文檔,然後按一下「插入 」功能表。點選新幻燈片。選擇空白或其他預設之一。仍然在插入選單中,按一下文字方塊。在投影片上拖出一個文字方塊。點擊文字方塊並輸入您

如何在MySQL中使用PHP編寫觸發器 如何在MySQL中使用PHP編寫觸發器 Sep 21, 2023 am 08:16 AM

如何在MySQL中使用PHP編寫觸發器MySQL是一種常用的關係型資料庫管理系統,而PHP是一種流行的伺服器端腳本語言。在MySQL中使用PHP編寫觸發器可以幫助我們實現自動化的資料庫操作。本文將介紹如何使用PHP來撰寫MySQL觸發器,並提供具體的程式碼範例。在開始之前,請確保已經安裝了MySQL和PHP,並且已經建立了相應的資料庫表。一、創建PHP檔案和數據

如何在MySQL中使用PHP編寫自訂觸發器和預存程序 如何在MySQL中使用PHP編寫自訂觸發器和預存程序 Sep 20, 2023 am 11:25 AM

如何在MySQL中使用PHP編寫自訂觸發器和預存程序引言:在開發應用程式時,我們經常需要在資料庫層面進行一些操作,例如插入、更新或刪除資料。 MySQL是一個廣泛使用的關聯式資料庫管理系統,而PHP是一種流行的伺服器端腳本語言。本文將介紹如何在MySQL中使用PHP編寫自訂觸發器和預存流程,並提供具體的程式碼範例。一、什麼是觸發器和預存程序觸發器(Trigg

oracle如何添加觸發器 oracle如何添加觸發器 Dec 12, 2023 am 10:17 AM

在Oracle資料庫中,您可以使用CREATE TRIGGER語句來新增觸發器。觸發器是一種資料庫對象,它可以在資料庫表上定義一個或多個事件,並在事件發生時自動執行相應的操作。

如何在MySQL中使用Python編寫自訂觸發器 如何在MySQL中使用Python編寫自訂觸發器 Sep 20, 2023 am 11:04 AM

如何在MySQL中使用Python編寫自訂觸發器觸發器是MySQL中的一種強大的功能,它可以在資料庫中的表上定義一些自動執行的操作。而Python則是一種簡潔而強大的程式語言,能夠方便地與MySQL進行互動。本文將介紹如何使用Python編寫自訂觸發器,並提供具體的程式碼範例。首先,我們需要安裝並匯入PyMySQL函式庫,它是Python與MySQL資料庫進行

MySQL觸發器中參數的使用方法 MySQL觸發器中參數的使用方法 Mar 16, 2024 am 09:27 AM

MySQL觸發器是一種在資料庫管理系統中用於監控特定資料表的操作,並根據預先定義的條件執行對應操作的特殊程序。在建立MySQL觸發器時,我們可以使用參數來靈活地傳遞資料和訊息,讓觸發器更具通用性和適用性。在MySQL中,觸發器可以在特定表的INSERT、UPDATE、DELETE操作前或後觸發執行對應的邏輯。使用參數可以使得觸發器更具靈活性,可以根據需要傳遞需要

mysql的觸發器是什麼等級的 mysql的觸發器是什麼等級的 Mar 30, 2023 pm 08:05 PM

mysql的觸發器是行級的。依照SQL標準,觸發器可以分為兩種:1、行級觸發器,對於修改的每一行資料都會啟動一次,如果一個語句插入了100行數據,將會呼叫觸發器100次;2、語句級觸發器,針對每個語句啟動一次,一個插入100行資料的語句只會呼叫一次觸發器。而MySQL中只支援行級觸發器,不支援預語句級觸發器。

如何在MySQL中使用C#編寫自訂預存程序、觸發器和函數 如何在MySQL中使用C#編寫自訂預存程序、觸發器和函數 Sep 20, 2023 pm 12:04 PM

如何在MySQL中使用C#編寫自訂預存程序、觸發器和函數MySQL是一種廣泛使用的開源關係型資料庫管理系統,而C#是一種強大的程式語言,對於需要與資料庫進行互動的開發任務來說,MySQL和C#是很好的選擇。在MySQL中,我們可以使用C#來編寫自訂預存程序、觸發器和函數,來實現更靈活和強大的資料庫操作。本文將引導您使用C#編寫並執

See all articles