知方可补不足~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自动完成的,所以要求 ...
随机推荐
- python3中返回字典的键
我在看<父与子的编程之旅>的时候,有段代码是随机画100个矩形,矩形的大小,线条的粗细,颜色都是随机的,代码如下, import pygame,sys,random from pygame ...
- 用Python写爬虫爬取58同城二手交易数据
爬了14W数据,存入Mongodb,用Charts库展示统计结果,这里展示一个示意 模块1 获取分类url列表 from bs4 import BeautifulSoup import request ...
- DOS tasklist 命令(转)
Dos命令之Tasklist用法及参数函义 2012-10-24 14:44:34| 分类: Windows |字号 订阅 TASKLIST [/S system [/U username [/ ...
- vs.net2008工具栏上找不到debug/release选项
使用vs.net多年,以前不时会用到release发布,近几年几乎不用的.近来生成时感觉有些项目使用了release选项,因为生成的dll的位置变了.于是想调整回bebug,发现vs.net2008的 ...
- C#将科大讯飞语音合成文件转换为MULAW音频格式
任务描述:通过科大讯飞语音合成组件在线完成文本转语音的合成,然后再转换为电话系统IVR要求的音频格式: wave mu-law 16位 8kHZ 64kbps. 完成步骤: 首先,我们要先通过科大讯飞 ...
- 关于原生JS获取类相关的代码
<script> var FungetElementsByClassName = function(str,root,tag){ if(root){ root = typeof root ...
- JSP中<base href="<%=basePath%>">作用
通常在JSP页面开通有如下代码: <% String path = request.getContextPath(); String basePath = request.getScheme() ...
- RHEL6.5 删除桌面启动器(计算机/Home/回收站)
首先,安装gconf-editor以获得gconftool-2命令 终端命令: gconftool-2 --set /apps/nautilus/desktop/computer_icon_visib ...
- js jq 获取网页元素宽度
Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度d ...
- Sublime Text 3专题
MarkDown语法记笔记 1.下载&&安装 下载 常用插件安装 Submlit使用教程 [如何优雅地使用Sublime Text3] 2.Sublime Text 便捷技巧 [以PH ...