知方可补不足~sqlserver中触发器的使用
触发器在过去的10年中,即存储过程和ado.net称霸江湖期间是那么的重要,而现在,trigger显得不是那么必要的,我们很少将复杂的业务写在SQL里,当然也会没有机会写到trigger里了,可对于数据库本身来说,这东西还是要说说的,尤其是一些特殊场合,看看下面的触发器使用场合:
aaarticlea/png;base64,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" alt="" />
这种结构很有意思,在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中触发器的使用的更多相关文章
- 知方可补不足~sqlserver中使用sp_who查看sql的进程
回到目录 在SQLSERVER中每个会话,即每个查询分析器窗口都会产生一个SQL进程,对于那些持续时间短的进程,它们转瞬即失,而对于持续时间比较长的,我们需要希望查看它的运行状态,就可以借助SQL提供 ...
- 知方可补不足~Sqlserver中的几把锁和.net中的事务级别
回到目录 当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项 SQL的几把锁 NOLOC ...
- 知方可补不足~Sqlserver中的几把锁和.net中的事务级别 回到目录
当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项 SQL的几把锁 NOLOCK(不加锁 ...
- 知方可补不足~Sqlserver发布订阅与sql事务的关系
回到目录 前几讲说了一下通过sqlserver的发布与订阅来实现数据的同步,再通过EF这个ORM架构最终实现架构系统的读写分离,而在使用发布与订阅来实现数据同步时,需要我们注意几点,那就是当操作被使用 ...
- 知方可补不足~SQL2008中的发布与订阅模式~续
回到目录 上一回介绍了如何在sql2008中建立一个数据库的发布者,今天来说一下如何建立一个订阅者,其实订阅者也是一个数据库,而这个数据库是和发布者的数据结构相同的库,它们之间通过SQL代理进行数据上 ...
- 知方可补不足~SQL中的count命令的一些优化措施(百万以上数据明显)
回到目录 SQL中对于求表记录总数的有count这个聚合命令,这个命令给我们感觉就是快,比一般的查询要快,但是,当你的数据表记录比较多时,如百万条,千万条时,对于count来说,就不是那么快了,我们需 ...
- 知方可补不足~SqlServer自动备份数据库及清理备份文件
回到目录 对于SQLSERVER这个关系型数据库来说,为了保持数据的安全,备份是必须的,当你的一个误操作导致数据丢失,这可能是灾难性的,是不被允许发生的,这时,我们必须要做好定期的备份工作,如我们可以 ...
- 知方可补不足~SqlServer连接的复用MultipleActiveResultSets
回到目录 MultipleActiveResultSets可以使数据库连接复用,但当你上了moebius这种集群工具后,这个选项不能开启(默认是false),当你使用EF等ORM工具时,这个选项会默认 ...
- 知方可补不足~SQL2008中的发布与订阅模式
回到目录 作用:完成数据库与数据库的数据同步 原理:源数据库发布需要同时的表,存储过程,或者函数:目标数据库去订阅它,当源发生变化时,目标数据库自己同步,注意,由于这个过程是SQL自动完成的,所以要求 ...
随机推荐
- poj3728
[描述] 有 N 城 市在一个国家,有一个且只有一个简单的路径每一对城市之间. 一个商人选择了一些路径和想赚尽可能多的钱在每个路径. 当他沿着一条路径,可以选择一个城市购买一些商品和出售他们在一个城市 ...
- Spring JdbcTemplate 调用存储过程
遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的. 参考网络中的方法,在实际操作中遇到两个 ...
- Swift - mutating关键字的使用
转载自:http://www.jianshu.com/p/14cc9d30770a 感谢作者:此ID想了很久 Swift中protocol的功能比OC中强大很多,不仅能再class中实现,同时也适用 ...
- InnoDB配置文件复习
1.文件分类 1.参数文件 2.日志文件 3.socket文件 4.pid文件 5.MySQL表文件 6.存储引擎文件 1.参数文件 1.参数内容写在my.cnf中,每次MySQL实例启动时,载入my ...
- [UE4]AnimDynamics简介
AnimDynamics简介 Author:Jia Zhipeng AnimDynamics是UE4.11 Preview 5测试版本发布的AnimationBlueprint中的新节点.功能是通过简 ...
- xxxx年度员工岗位技能调查表
昨天应公司要求设计了一张 <员工岗位技能调查表>,写微博有2个目的:第一是供大家参考,第二是记录下从事质量管理工作走过的点点滴滴.这是我第一次写工作方面的博客,之后会坚持写下去的. --- ...
- Linux内核--网络栈实现分析(十一)--驱动程序层(下)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地 ...
- IOS 计时器暂停和开始 防止重复点击
-(IBAction)btnClick{ [self starTimer];//开始计时 //[self stopTimer]; } -(NSTimer*)timer{ if (!_timer) { ...
- [ASE][Daily Scrum]11.28
昨天基本上已经完成了sprint2的task, 现在剩下一些bug还需要来修正, 然后我正式加入码代码的大军啦~ Shilin Liu 显示聊天框 Zhao Li 搭建聊天服务器 Yimin ...
- 在CentOS上搭建最^1024基本的Nginx反向服务器
昨天有过去的同事突然问我,他在CentOS7上试验搭建反向服务器死活不成功.现将最简单的搭建步骤分享下: 0. 环境介绍 本次搭建的集群包括以下服务器 192.168.1.107:nginx反向服务器 ...