SQLServerDML触发器之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;
图14-1 删除PriTable表中OrderID为1的行时得到的结果和消息
如果执行下面的语句,准备从PriTable表中删除OrderID为3的行。由于PriTable表中并不存在这样的行,所以并不会删除成功。虽然没有删除成功,但是在消息窗口中仍然可以看到由触发器的PRINT语句发回的信息。这说明即使语句没有影响到表中的行,也会激活触发器。在没有删除成功的情况下,Deleted表是一个空表。
DELETE FROM PriTable WHERE OrderID = 3;

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PowerPoint でクリックする前にテキストを非表示にする方法 PowerPoint スライド上の任意の場所をクリックしたときにテキストを表示したい場合、設定はすばやく簡単です。 PowerPoint でボタンをクリックする前にテキストを非表示にするには: PowerPoint ドキュメントを開き、[挿入] メニューをクリックします。 「新しいスライド」をクリックします。 [空白] または他のプリセットのいずれかを選択します。 [挿入] メニューで [テキスト ボックス] をクリックします。テキスト ボックスをスライド上にドラッグします。テキストボックスをクリックして、あなたの名前を入力してください

PHP を使用して MySQL にトリガーを記述する方法 MySQL は一般的に使用されるリレーショナル データベース管理システムであり、PHP は一般的なサーバーサイド スクリプト言語です。 PHP を使用して MySQL にトリガーを記述すると、データベース操作の自動化を実現できます。この記事では、PHP を使用して MySQL トリガーを作成する方法を紹介し、具体的なコード例を示します。開始する前に、MySQL と PHP がインストールされ、対応するデータベース テーブルが作成されていることを確認してください。 1. PHPファイルとデータを作成する

PHP を使用して MySQL でカスタム トリガーとストアド プロシージャを作成する方法 はじめに: アプリケーションを開発するとき、多くの場合、データの挿入、更新、削除など、データベース レベルでいくつかの操作を実行する必要があります。 MySQL は広く使用されているリレーショナル データベース管理システムであり、PHP は一般的なサーバー側スクリプト言語です。この記事では、PHP を使用して MySQL でカスタム トリガーとストアド プロシージャを作成する方法を紹介し、具体的なコード例を示します。 1. トリガーおよびストアド プロシージャ トリガー (Trigg

Python を使用して MySQL でカスタム トリガーを作成する方法 トリガーは、データベース内のテーブルに対して自動的に実行される操作を定義できる MySQL の強力な機能です。 Python は、MySQL と簡単に対話できる、簡潔で強力なプログラミング言語です。この記事では、Python を使用してカスタム トリガーを作成する方法を紹介し、具体的なコード例を示します。まず、PyMySQL ライブラリをインストールしてインポートする必要があります。これは、Python が MySQL データベースを操作する方法です。

Oracle データベースでは、CREATE TRIGGER ステートメントを使用してトリガーを追加できます。トリガーは、データベース テーブルに 1 つ以上のイベントを定義し、イベントの発生時に対応するアクションを自動的に実行できるデータベース オブジェクトです。

MySQL トリガーは、特定のテーブルの操作を監視し、事前定義された条件に基づいて対応する操作を実行するためにデータベース管理システムで使用される特別なプログラムです。 MySQL トリガーを作成する場合、パラメーターを使用してデータと情報を柔軟に渡すことができるため、トリガーの汎用性と適用性が高まります。 MySQL では、トリガーは、特定のテーブルの INSERT、UPDATE、および DELETE 操作の前後に、対応するロジックをトリガーして実行できます。パラメーターを使用すると、トリガーをより柔軟にし、必要に応じて渡すことができます。

MySQL トリガーは行レベルです。 SQL 標準によれば、トリガーは次の 2 つのタイプに分類できます: 1. 行レベルのトリガー、変更されたデータ行ごとに 1 回アクティブ化されます。ステートメントが 100 行のデータを挿入すると、トリガーは 100 回呼び出されます。 . ステートメントレベルのトリガー トリガーはステートメントごとに 1 回アクティブ化され、100 行のデータを挿入するステートメントはトリガーを 1 回だけ呼び出します。 MySQL は行レベルのトリガーのみをサポートし、プリペアドステートメントレベルのトリガーはサポートしません。

C# を使用して MySQL でカスタム ストアド プロシージャ、トリガー、関数を作成する方法 MySQL は広く使用されているオープン ソースのリレーショナル データベース管理システムであり、C# はデータベースとの対話を必要とする開発タスク用の強力なプログラミング言語です。選択肢。 MySQL では、C# を使用してカスタム ストアド プロシージャ、トリガー、関数を作成し、より柔軟で強力なデータベース操作を実現できます。この記事では、C# を使用して記述および実行する方法について説明します。
