知方可补不足~sqlserver中触发器的使用

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

触发器在过去的10年中,即存储过程和ado.net称霸江湖期间是那么的重要,而现在,trigger显得不是那么必要的,我们很少将复杂的业务写在SQL里,当然也会没有机会写到trigger里了,可对于数据库本身来说,这东西还是要说说的,尤其是一些特殊场合,看看下面的触发器使用场合:

这种结构很有意思,在SQLSERVER中实现两个数据库实时同步的方法有很多,比较简单的是“发布与订阅”,但说实话,这东西是有风显的,只要一个服务重新启动,它的同步数据就被删除了,即,后台数据库数据被删除,需要重新进行同步,感觉挺危险的,今天主要说的是一种传统的方法实现某些表数据的同步,即使用触发器实现数据的同步。

我们以Category表为例,前台数据库名为[background],后台数据库名为[background_copy],当category表有数据插入时,[background_copy]表的数据自动实现插入,看一下代码部分吧:

USE [background]
GO
/****** Object:  Trigger [dbo].[Trigger_Categoryinsert]    Script Date: 09/10/2013 15:31:41 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Trigger_Categoryinsert] ON [background].[dbo].[Category]
    AFTER INSERT
AS
    SET IDENTITY_INSERT background_copy.[dbo].[Category] ON 
    INSERT  INTO background_copy.dbo.category
            ( [ID] ,
              [ParentID] ,
              [Level] ,
              [Name] ,
              [IsParent] ,
              [CreateDate] ,
              [Sortable]
            )
            SELECT  [ID] ,
                    [ParentID] ,
                    [Level] ,
                    [Name] ,
                    [IsParent] ,
                    [CreateDate] ,
                    [Sortable]
            FROM    INSERTED
    SET IDENTITY_INSERT background_copy.[dbo].[Category] OFF

我们可以看到,代码中使用SET IDENTITY_INSERT TableName ON/OFF命令,即,你的数据表主键是自增的,在同步时,需要去掉后台表的自增特性,这样才可以与前台的自增主键保持一致。

下面再看一下触发器的更新,使用场合介绍:当category表的name字段有更新后,自动同步到background_copy.[dbo].[Category] 表的name字段

USE [background]
GO
/****** Object:  Trigger [dbo].[Trigger_CategoryUpdate]    Script Date: 09/10/2013 16:06:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Trigger_CategoryUpdate] ON [dbo].[Category]
    AFTER UPDATE
AS
    IF UPDATE(Name) 
        BEGIN
            UPDATE  [background_copy].[dbo].[Category]
            SET     [Name] = ( SELECT   name
                               FROM     INSERTED
                             )
            WHERE   ID = ( SELECT   id
                           FROM     INSERTED
                         )
        END
    

 再来看一个更新表所有字段的,事实上就是把原来的记录删除,把新修改的记录插入就可以了,要求你注意的是自增主键的开关问题,看代码:

USE [BACKGROUND_COPY]
GO
/****** OBJECT:  TRIGGER [DBO].[TRIGGER_CATEGORYUPDATE]    SCRIPT DATE: 09/13/2013 18:01:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [DBO].[TRIGGER_CATEGORYUPDATE] ON [DBO].[CATEGORY]
    AFTER UPDATE
AS
    DELETE  BACKGROUND_COPY2.DBO.CATEGORY
    WHERE   ID = ( SELECT   ID
                   FROM     INSERTED
                 ) 

    SET IDENTITY_INSERT BACKGROUND_COPY2.DBO.CATEGORY ON
    INSERT  INTO BACKGROUND_COPY2.DBO.CATEGORY
            ( ID ,
              PARENTID ,
              LEVEL ,
              NAME ,
              ISPARENT ,
              CREATEDATE ,
              SORTABLE
            )
            SELECT  *
            FROM    INSERTED
    SET IDENTITY_INSERT  BACKGROUND_COPY2.DBO.CATEGORY OFF

 看一下删除功能的触发器:

USE [BACKGROUND_COPY]
GO
/****** OBJECT:  TRIGGER [DBO].[TRIGGER_CATEGORYDELETE]    SCRIPT DATE: 09/13/2013 17:58:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [DBO].[TRIGGER_CATEGORYDELETE] ON [DBO].[CATEGORY]
    AFTER DELETE
AS
    DELETE  BACKGROUND_COPY2.DBO.CATEGORY
    WHERE   ID = ( SELECT   ID
                   FROM     DELETED
                 ) 
                 

OK,现在我们的category表就可以实现自动同步了,呵呵

本文转自博客园张占岭(仓储大叔)的博客,原文链接:知方可补不足~sqlserver中触发器的使用,如需转载请自行联系原博主。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
1天前
|
存储 SQL
SQL Server 存储过程 触发器 事务处理
SQL Server 存储过程 触发器 事务处理
|
10月前
|
存储 SQL 安全
数据库SQL Server 9-10 章(存储过程与触发器)
数据库SQL Server 9-10 章(存储过程与触发器)
154 0
|
10月前
|
存储 SQL 数据库
sqlserver触发器的使用以及inserted和deleted详解
sqlserver触发器的使用以及inserted和deleted详解
433 0
|
10月前
|
SQL 存储 安全
SQL Server——触发器
触发器,是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。经常通过触发器来强制实现不同表中的逻辑相关数据的引用完整性或一致性。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过过程名字而直接调用。当对某一个表进行诸如UPDATE、INSERT、DELETE这些操作时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则
|
10月前
|
SQL 存储 开发框架
SqlServer触发器的创建与使用
SqlServer触发器的创建与使用
|
10月前
|
SQL 存储 监控
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
sqlserver触发器详解:sqlserver触发器after/for和instead of的区别详解(实例讲解),触发器定义创建操作打通,触发器的优缺点,触发器使用建议
1270 1
|
SQL 存储 安全
SQL Server 触发器
SQL Server 触发器
96 0
|
SQL 存储 程序员
【Sql Server】创建触发器,以及通过触发器来统计阅读数量(下)
在本篇文章中,主要来讲讲数据库中的触发器功能 在实际项目中,触发器多数用到在数据添加、修改、删除时,额外去做的一些操作,比如:数据删除了,会通过触发器将删除数据备份到另一个表,再或者文章被阅读,通过触发器更新阅读数量
204 0
【Sql Server】创建触发器,以及通过触发器来统计阅读数量(下)
|
SQL 存储 Go
数据库原理与应用(SQL Server)笔记 第九章 存储过程和触发器(下)
数据库原理与应用(SQL Server)笔记 第九章 存储过程和触发器
数据库原理与应用(SQL Server)笔记 第九章 存储过程和触发器(下)
|
2月前
|
关系型数据库 MySQL
Mysql基础第二十八天,使用触发器
Mysql基础第二十八天,使用触发器
28 0
Mysql基础第二十八天,使用触发器