一、触发器知识点摘要: 

实际应用中,我们经常会遇到在对SQL Server的某一张表进行增加、删除、修改操作时,需同步更新同一数据库或不同数据库的另一张表,此时我们可以使用SQL Server 的表触发器来实现。

使用触发器时,我们会用到触发器的两个临时虚拟表:Deleted表、Inserted表,它们用于存储【创建触发器表】的记录变动信息,即发生触发事件时对应的【一条旧记录】和【一条新记录】,各触发事件对应表数据如下:

触发事件虚拟表Inserted虚拟表Deleted
新增记录存放新增的记录
修改记录存放用来更新的新记录(新记录)存放更新前的记录(旧记录)
删除记录存放被删除的记录

举例说明: 

修改记录时,触发Update事件,Update的过程可以看作为:复制旧记录到Deleted表、生成新的记录到Inserted表,然后删除表记录并写入新纪录。

二、如何创建触发器: 

以SQL Server2008R2为基础,在【数据库A.dbo.表TA】表发生变化时,同步触发【数据库B.dbo.表TB】例,两张表结构如下图:

举例数据库表结构


 

创建触发器步骤如下: 

1、打开SQL Server企业管理器【SQL Server Management Studio】-展开【数据库】至需创建触发器的表,如下图示例中的【数据库A】.【表TA】-右键单击【触发器】-【新建触发器】,如下图:

创建触发器

2、右侧查询分析器窗口输入以下示例代码,创建UPDATE、INSERT事件触发器:

USE [A]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[Empty_Update]	--首次创建CREATE,后续修改ALTER:更新、新增触发器
   ON  [dbo].[TA]	----在TA表中创建触发器
   AFTER INSERT,UPDATE	--更新、新增事件触发
AS	--执行SQL语句


DECLARE @PerID AS int	--定义变量
SELECT @PerID=id FROM inserted	--变量赋值:临时表inserted中存放的新id

IF EXISTS(SELECT id_b FROM B..TB WHERE B..TB.id_b=@PerID)	--如果记录已存在,执行UPDATE操作
BEGIN

	UPDATE B..TB SET
		B..TB.code_b=code,
		B..TB.name_b=name
	FROM inserted WHERE B..TB.id_b=@PerID

END

ELSE IF @PerID IS NOT NULL	--如果记录不存在且id不为空,执行INSERT操作
BEGIN

	SET IDENTITY_INSERT B..TB ON	--允许主键插入显式值

	INSERT INTO B..TB(
	id_b,code_b,name_b
	)SELECT 
	id,code,name 
	FROM inserted

	SET IDENTITY_INSERT B..TB OFF	--禁止主键插入显式值

END

注:首次创建触发器时必须使用CREATE命令,以后如需对触发器进行修改,需将 CREATE 修改为:ALTER。 

3、触发器编写完成后,点击【√分析】,语法无误后再点击【执行】,如下图:

SQL分析与执行

4、成功【执行】后,将在[a].[dbo].[TA]触发器下CREATE一个名称为[Empty_Update]的触发器,如下图:

创建触发器示例

5、重复步骤1,在右侧查询分析器窗口输入以下示例代码,创建DELETE事件触发器:

USE [A]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[Empty_Delete]	--首次创建CREATE,后续修改ALTER:删除触发器
   ON  [dbo].[TA]	----在TA表中创建触发器
   AFTER DELETE	--删除事件触发
AS	--执行SQL语句

DECLARE @DelID AS int	--定义变量
SELECT @DelID=id FROM Deleted	--变量赋值:临时表Deleted中存放的被删除id

IF @DelID IS NOT NULL	--如果删除id不为空,执行DELETE操作

BEGIN

	DELETE FROM B..TB WHERE B..TB.id_b =@DelID

END

6、成功执行后,将在[a].[dbo].[TA]触发器下再次CREATE一个名称为[Empty_Delete]的触发器。

注意事项:

在Microsoft SQL Server Management Studio 企业管理器中,通过【导入数据】向导从其他表或EXCEL中导入数据时,触发器不触发。

扩展阅读:

触发器的工作原理:

    触发器是一种特殊类型的存储过程,它与表紧密联系在一起,在对表进行插入、删除和更新时,如该表(也称触发器表)有相应操作类型的触发器,则触发器便会自动触发执行。触发器分为INSERT触发器、DELETE触发器和UPDATE触发器3类。当向触发器表中插入数据时,INSERT触发器将触发执行,新的记录会增加到触发器表和inseted表中;当删除触发器表中的数据时,DELETE触发器将触发执行,被删除的记录会存放到deleted表中;当更新触发器表中的数据时,相当于插入一条新记录和删除一条旧记录,此时UPDATE触发器将触发执行,表中原有的记录存放到deleted表中,修改后的记录插入到inserted表中。其中inserted表和deleted表是两个逻辑表,由系统来维护,不允许用户直接对这两个表进行修改。它们存放于内存中,不存放在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器工作完成后,与该触发器相关的这两个表也会被删除。deleted表用于存储SQL语言中DELETE和UPDATE语句所影响的行的复本。在执行DELETE或 UPDATE语句时,行从触发器表中删除,并传输到 deleted 表中。deleted 表和触发器表通常没有相同的行;inserted 表用于存储 SQL语言中INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。inserted 表中的行是触发器表中新行的副本。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐