返回首页
当前位置: 主页 > 网络编程 > .Net实例教程 >

SQL Server 2005中实现通用的异步触发器架构

时间:2011-05-10 11:41来源:betway必威官网www.etsupport.net 编辑:麦田守望者

在SQL Server 2005的中,通过新增的Service Broker的可以实现异步触发器的处理功能。本文提供一种使用Service Broker的实现的通用异步触发器方法。
在本方法中,通过服务代理构造异步触发器处理架构,对于要使用这种架构的表,只需要创建相应的触发器及处理触发器中数据的存储过程,并且在异步触发器架构中登记触发器和处理的存储过程即可。如果一个触发器中的数据要被多个表使用,只需要在dbo.tb_async_trigger_subscribtion中登记相应处理数据的存储过程即可,即一个表的数据变更可以被多个表订阅(使用)。
架构的步骤如下:
1。数据库配置
需要配置数据库以允许使用服务代理。本文以tempdb的库为例,故配置均在tempdb中的上下文中进行。
复制代码
使用tempdb的GO - 允许服务代理的ALTER DATABASE tempdb的设置ENABLE_BROKER转到
2。构建异步触发器相关的对象
下面的T - SQL中创建异步触发器处理架构相关的对象。
复制代码
- ======================================= - 异步触发器对象 - 1 。 服务代理对象 - ======================================= - 答 消息类型,要求使用的XML传递数据创建消息类型MSGT_async_trigger验证= WELL_FORMED_XML的GO - 湾 只需要发送消息创建合同CNT_async_trigger(单体引发东南MSGT_async_trigger)转到 - 角 存储消息的队列排队dbo.Q_async_trigger转到创作 - 四 用于消息处理的服务创建服务SRV_async_trigger在队列dbo.Q_async_trigger(CNT_async_trigger)转到 - ============================== ========= - 异步触发器对象 - 2。 异步触发器处理的对象 - ======================================= - 一。 登记异步触发器的表的CREATE TABLE dbo.tb_async_trigger(主键来确定是,table_name的数据类型为sysname,trigger_name sysname类型) - 湾 登记订阅异步触发器的存储过程的CREATE TABLE dbo.tb_async_trigger_subscriber(主键来确定是,过程名sysname类型) - 角 异步触发器和存储过程之间的订阅关系的CREATE TABLE dbo.tb_async_trigger_subscribtion(trigger_id诠释参考dbo.tb_async_trigger(身份证),procedure_id诠释参考dbo.tb_async_trigger_subscriber(身份证),主键(trigger_id,procedure_id))的GO - 四 发送消息的存储过程的CREATE触发dbo.p_async_trigger_send的AS SET NOCOUNT为@ @声明的XML消息处理的uniqueidentifier对话会话的BEGIN @处理合同CNT_async_trigger从服务[SRV_async_trigger]以服务N'SRV_async_trigger'与加密=关;发送会话@处理消息类型MSGT_async_trigger(@消息) - 消息发出即可,不需要回复,因此发出后即可结束会话结束会话@处理的GO - 大肠杆菌 处理异步触发器发送的消息作为创作的PRoC dbo.p_async_trigger_process SET NOCOUNT为ON的DECLARE @处理的uniqueidentifier,@文XML,@行诠释设置@ @行= 1,而行> 0开始 - 处理已经收到的消息的WAITFOR(接收顶(1)@处理= conversation_handle,@消息=无论如何,当message_type_name = N'MSGT_async_trigger',那么转换(XML中,message_body),否则返回null年底的dbo.Q_async_trigger),超时设置@ 10行= @ @ ROWCOUNT的中频@行> 0开始 - 结束会话结束会话@处理; - 处理消息 - 答 取发送者信息的DECLARE @ table_name的数据类型为sysname,@ trigger_name数据类型为sysname,@的sql为nvarchar(max)= @ table_name的选择@ message.value('(/根/表名)[1]','数据类型为sysname'),@ trigger_name = @消息。价值('(/根/ trigger_name)[1]','数据类型为sysname') - 湾 调用异步触发器订阅的存储过程;和子的AS(选择TR.table_name,TR.trigger_name,SUB.procedure_name从dbo.tb_async_trigger风帆,dbo.tb_async_trigger_subscriber子,dbo.tb_async_trigger_subscribtion TRSUB哪里TRSUB.trigger_id = TR.ID与TRSUB 。procedure_id = SUB.ID)选择@的sql =(选择N'执行'过程名+名词+'@消息'从子在表格名= @ = @ table_name和trigger_name的XML路径(''),根(为'r'trigger_name 。),类型)值('(/ R)的[1]','为nvarchar(max)')EXEC键sp_executesql的@ SQL中,ñ'@文XML',@消息月底结束的GO - 楼 绑定处理的存储过程到队列排队dbo.Q_async_trigger的ALTER与激活(状态= ON时,过程名= dbo.p_async_trigger_process,MAX_QUEUE_READERS = 10,作为业主的EXECUTE)转到
3。使用示例
。下面的T - SQL的演示使用异步触发器构架示例中创建了三个表:
Dbo.t1 这个是源表,此表的数据变化将用于其他表
Dbo.t2 这个表要求保持与dbo.t1同步
Dbo.tb_log 这个表记录dbo.t1中的数据变化情况
触发器TR_async_trigger用于将表Dbo.t1中的数据变化发送到异步触发器构架中。dbo.p_Sync_t1_t2和dbo.p_Record_log用于处理dbo.t1于中变化的数据。
在处理时,需要把相关的信息登记到异步触发器架构的表中。
复制代码
- ======================================= - 3。 使用示例 - ======================================= - ===== ========================== - 测试对象 - 答 源表的CREATE TABLE dbo.t1(docount来确定主键,彩色诠释) - 湾 同步的目的表的CREATE TABLE dbo.t2(docount来确定主键,彩色诠释) - 角 记录操作的日志表的CREATE TABLE dbo.tb_log(docount来确定主键,user_name的数据类型为sysname,operate_type为varchar(10),插入的XML,删除XML)的转到 - 答 异步发送处理消息的触发器的CREATE TRIGGER TR_async_trigger对dbo.t1对于INSERT,更新,删除的IF @ @ ROWCOUNT的= 0返回SET NOCOUNT为开 - 将要发送的数据生成的XML数据的DECLARE @文XML选择@消息=(选择表名=(选择前1的OBJECT_NAME(parent_object_id)从sys.objects哪里的object_id = @ @ PROCID),trigger_name =的OBJECT_NAME(@ @ PROCID),用户名= SUSER_SNAME(),插入=(选择*从XML的汽车,插入式) ,删除=对于XML路径(''),根('根'),类型(选择*从XML的汽车,型号删除)​​) - 发送消息EXEC键dbo.p_async_trigger_send = @ @消息消息的GO - 湾 处理异步触发器的存储过程 - B.1的同步到T2的的存储过程的CREATE触发dbo.p_Sync_t1_t2 @作为SET NOCOUNT为信息在插入位的XML声明@ @ @删除位选择插入= @ message.exist('/根/插入'),@ @ message.exist删除=('/根/删除'如果@ @插入= 1如果删除= 1) - 更新开始;与我的AS(选择ID = Tcvalue('@身份证[1] ','诠释'),彩色= Tcvalue('@彩色[1]','诠释')[email protected]('/根/插入/插入')笔(三)),d为(选择ID = Tcvalue('@身份证[1]','诠释'),彩色= Tcvalue('@彩色[1]','诠释')[email protected]('/根/删除/删除')笔(三) )更新一个集彩色= I.col从dbo.t2 A,我,D其中一答的ID = ID和一,四身份证号=完东西 - 插入的BEGIN集上的IDENTITY_INSERT dbo.t2;具有我当(选择ID = Tcvalue('@身份证[1]','诠释'),彩色= Tcvalue('@彩色[1]','诠释')[email protected]('/根/插入/插入')吨(三))插入dbo.t2(身份证,彩色)选择ID,彩色从我设置的IDENTITY_INSERT dbo.t2剪除其他 - 删除开始;与D为(选择ID = Tcvalue('@身份证[1]', '诠释'),彩色= Tcvalue('@彩色[1]','诠释')[email protected]('/根/删除/删除')笔(三))删除一个dbo.t2甲,Ð答:哪里的ID =四ID末尾的GO - B.2节记录操作记录到dbo.tb_log的AS SET NOCOUNT为的存储过程的CREATE触发dbo.p_Record_log消息的XML声明@ @插入位,位选择@ @删除插入= @ message.exist('/根/插入'),@ @ message.exist删除=('/根/删除')插入dbo.tb_log(用户名,operate_type,插入,删除)[email protected]('(/根/用户名)[1]','数据类型为sysname'),operate_type =无论如何,当插入= 1 @和@删除= 1,那么'更新'当@ = 1,那么插入'插入'时@删除= 1,那么'删除'端@ message.query('/根/插入'),@ message.query('/根/删除')的GO - ====================== ========= - 在异步触发器处理系统中登记对象插入dbo.tb_async_trigger(表名,trigger_name)值(N't1',N'TR_async_trigger')插入dbo.tb_async_trigger_subscriber(过程名)选择N 'dbo.p_Sync_t1_t2'联盟的所有选择N'dbo。p_Record_log'插入dbo.tb_async_trigger_subscribtion(trigger_id,procedure_id)选择1,一联盟的所有选择一,二去
4。使用测试
下面的T - SQL中修改表dbo.t1中的数据,并检查dbo.t2,dbo.tb_log中的数据,以确定异步触发器架构的工作是否成功。
执行完成后可以看到dbo.t2,dbo.tb_log中有相关的记录。
复制代码
- =============================== - 测试的INSERT dbo.t1选择一联盟的所有选择2更新dbo.t1集彩色= 2其中id = 1删除dbo.t1其中id = 2 - WAITFOR延迟'00显示结果:00:05' - 延迟5分钟,以便有时间处理消息(因为是异步的)的SELECT *从DBO的。T2的选择*从dbo.tb_log转到
5。使用测试
下面的T - SQL中删除本文中建立的所有对象。
复制代码
- ======================================= - 5。 删除相关的对象 - ======================================= - 答 删除服务代理对象服务SRV_async_trigger降降降排队dbo.Q_async_trigger合同CNT_async_trigger降消息类型MSGT_async_trigger的GO - 湾 删除异步触发器处理的相关对象的PRoC dbo.p_async_trigger_process降降降表dbo.tb_async_trigger_subscribtion触发dbo.p_async_trigger_send的DROP TABLE dbo.tb_async_trigger_subscriber的DROP TABLE dbo.tb_async_trigger转到 - 角 删除测试的对象的DROP TABLE dbo.tb_log,dbo.t1,dbo.t2降的PRoC dbo.p_Sync_t1_t2,dbo.p_Record_log

顶一下
(2)
100%
踩一下
(0)
0%
标签(Tag):数据库 SQLServer
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片