我现在的位置:

微知识 - 知识分享 - 电脑网络 - 数据库
知识分享
  1. SQL Server 如何创建触发器实现一张表数据更新时,同步增加、删除、修改另一张表的数据。

    完善时间:2020-02-06 22:34:57会员:bekda目录:电脑网络 - 数据库浏览:12272 次

    一、触发器知识点摘要: 

    实际应用中,我们经常会遇到在对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 表中的行是触发器表中新行的副本。


联系方式:

南京贝加达电子科技有限公司

  • 地址:南京市江北新区柳州北路21号涤太太科技大楼2F
  • 联系人:焦倩华(先生)
  • 手机:13813916308
  • 邮箱:Ser@bekda.com
  • 服务专线:400-8282-116
©2010-2024 Bekda Electronic Technology Co., Ltd. All right reserved.

苏公网安备 32011102010041号

320111201705278429

苏ICP备12027725号