数据库的服务代理的问题,怎么没有效果呢? 50zhangchen124]

发布时间:2017-4-25 6:58:09 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"数据库的服务代理的问题,怎么没有效果呢? 50zhangchen124]",主要涉及到数据库的服务代理的问题,怎么没有效果呢? 50zhangchen124]方面的内容,对于数据库的服务代理的问题,怎么没有效果呢? 50zhangchen124]感兴趣的同学可以参考一下。

/* AdventureWorks.Inc的管理层想知道在一年的任何点的确切的年销售表以帮助它们计划未来的策略。 集合年销售数据是在SalesDB数据库的SalesDetails表中维护的. SalesOrderHeader:包含常规或父级销售订单信息;与销售订单关联的特定产品存储在 SalesOrderDetail 表中。 SalesOrderDetail:包含与特定销售订单关联的各个产品。一个销售订单可以订购多个产品。每个销售订单的常规 或父级信息存储在 SalesOrderHeader 中。每个订购的产品或子级信息存储在 SalesOrderDetail 中。 销售详情被存储在AdventureWorks数据库的SalesOrderHeader和SalesOrderDetail表中.为了保持 年销售数据更新,你需要确保无论何时任何订单被处理和在AdventureWorks数据库中交货日期被更新的 时候,订单的总钱数,存储在表的SubTotal列中,应该被添加到SalesDB数据库的总年销售中. */ --SalesDB数据库应该在服务器上,这个数据库被用于产生报告. /* 解决方案:需要在服务器上实现服务代理.为了实现服务代理,你需要完成如下任务: 1.创建一个服务程序。 2.创建消息类型、协议、队列和服务对象 3.在表上创建触发器 4.验证功能 */ --select * from Sales.SalesOrderHeader 31465行 --Select * from Sales.SalesOrderDetail 31465行 --1.创建SalesDB CREATE DATABASE SalesDB; GO drop database SalesDB USE SalesDB go CREATE TABLE SalesDetails--年销售详情表 ( Year varchar(4),--年 TotalSales money--年销售额 ) INSERT INTO SalesDetails VALUES ('2006',25000)--插入数据 --使服务代理可用 alter database AdventureWorks set Enable_Broker alter database SalesDB set Enable_broker --先让某一个触发器停用,基于SalesOrderHeader表 USE AdventureWorks GO DISABLE TRIGGER SalesOrderHeader.uSalesOrderHeader ON Sales.SalesOrderHeader --创建存储过程,以实现自动化的服务代理 USE SalesDB GO CREATE PROCEDURE OnReceiveMessage--OnReceiveMessage存储过程 AS    declare @message_type int--消息类型变量 declare @dialog uniqueidentifier,--会话变量 @ErrorSave INT,--错误点保存变量 @ErrorDesc NVARCHAR(100),--错误描述变量 @message_body int;--消息主体变量 while (1 = 1) begin begin transaction WAITFOR (--等待到某个时间执行语句 RECEIVE top(1)--从队列中选择第一条语句 @message_type=message_type_id, @message_body=message_body,    @dialog = conversation_handle  FROM SalesQueue ), TIMEOUT 3000--如果超时时间已到,则 RECEIVE 返回一个空结果集,即0行  if (@@ROWCOUNT = 0)--受上一语句影响的行数 BEGIN Rollback Transaction BREAK END  SET @ErrorSave = @@ERROR ;--执行的上一个 Transact-SQL 语句的错误号 IF (@ErrorSave <> 0)--有错误 BEGIN ROLLBACK TRANSACTION ; SET @ErrorDesc = N'An error has occurred.' ;--给错误信息赋值;以字母 N 为前缀标识 Unicode 字符串常量 --在服务器上执行的代码中(例如在存储过程和触发器中)显示的 Unicode 字符串常量必须以大写字母 N --为前缀。即使所引用的列已定义为 Unicode 类型,也应如此。如果不使用 N 前缀, --字符串将转换为数据库的默认代码页。这可能导致不识别某些字符。 END CONVERSATION @dialog WITH ERROR = @ErrorSave DESCRIPTION = @ErrorDesc ; --结束对话 END ELSE IF (@message_type <> 2)-- BEGIN UPDATE SalesDetails SET TotalSales = TotalSales + @message_body; --更新年销售总额表,让年销售总额自动加上消息里面的金额 END ELSE BEGIN END CONVERSATION @dialog--金额会话 END COMMIT TRANSACTION--提交事务 END --2.在AdventureWorks库中创建消息类型、协议、队列和服务对象  USE AdventureWorks GO CREATE MESSAGE TYPE SendMessage --创建消息类型:发送消息 VALIDATION = NONE--不验证 CREATE MESSAGE TYPE AcknowledgeMessage--创建消息类型:接收消息 VALIDATION = NONE--不验证 CREATE CONTRACT MyContract--创建协议 (SendMessage SENT BY INITIATOR,--初始化服务为:发送消息类型 AcknowledgeMessage SENT BY TARGET)--目标服务为:接收消息类型 CREATE QUEUE AdvQueue;--创建队列 CREATE SERVICE SalesService--创建基于队列消息的服务 ON QUEUE AdvQueue (MyContract)--使用MyContact协议 --3.在SalesDB库中创建消息类型、协议、队列和服务对象****************** --******************************************************************* USE SalesDB GO CREATE MESSAGE TYPE SendMessage VALIDATION = NONE CREATE MESSAGE TYPE AcknowledgeMessage VALIDATION = NONE CREATE CONTRACT MyContract (SendMessage SENT BY INITIATOR, AcknowledgeMessage SENT BY INITIATOR) CREATE QUEUE SalesQueue--销售队列     WITH STATUS=ON,--状态为打开     ACTIVATION (--指定使用的存储过程         PROCEDURE_NAME = OnReceiveMessage,         MAX_QUEUE_READERS = 5,--最大队列数为5个 Execute AS SELF) ;--当前用户执行 CREATE SERVICE RecieveService--接收服务 ON QUEUE SalesQueue (MyContract) --********************************************************************* --4.在SalesOrderHeader表上创建触发器,实现:当完成任何销售的时候更新SalesDB数据库 USE AdventureWorks GO --select * from Sys.sysobjects where name='SendTrigger' drop trigger SendTrigger --sp_helptext SendTrigger alter TRIGGER SendTrigger--创建触发器 ON Sales.SalesOrderHeader FOR UPDATE AS--基于SalesOrderHeader的更新触发器 DECLARE @amt AS int--定义变量 SELECT @amt = SubTotal FROM INSERTED--总数,从插入的临时表中获得 DECLARE @dialog_handle UNIQUEIDENTIFIER ; --定义会话变量 BEGIN DIALOG CONVERSATION @dialog_handle FROM --开始会话,从销售服务到接收服务 SERVICE  [SalesService] TO SERVICE 'RecieveService' ON CONTRACT [MyContract] ; SEND ON CONVERSATION --发送消息,类型为SendMessage,[email protected],即更新的总数 @dialog_handle MESSAGE TYPE[SendMessage] (@amt) select @amt --5.AdventureWorks表, USE AdventureWorks GO --6.执行更新操作,来响应触发器 update Sales.SalesOrderHeader set SubTotal =4445 where SalesOrderID = 43692 --7.查看SalesDB库年度销售表的数据 use SalesDB go select  * from SalesDetails --最终无效果,不知何为? 最终修改AdventureWorks的数据库的内容,可以修改了SalesDB库中的内容.我的没有反应,不知道啥原因.

这个只有帮顶了.

已经搞定了.呵呵.设置权限.

接点分,hehe

现在的领导追求细节,毛利啊,毛利率等等东东.. 用存储过程执行统计~~~

上一篇:只有一个mdf文件 SQL2005 如何回复数据库,欢迎大家进来讨论 200arrow_gx]
下一篇:我的成语最长,有词库分享 10Even713]

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款