首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务经纪人内部激活中毒-在哪里?

服务经纪人内部激活中毒-在哪里?
EN

Stack Overflow用户
提问于 2015-09-14 20:20:54
回答 1查看 219关注 0票数 0

我正经历着有害的信息,我不知道为什么。

我的代理设置如下所示:

代码语言:javascript
复制
CREATE MESSAGE TYPE
  [//DB/Schema/RequestMessage]
  VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE
  [//DB/Schema/ReplyMessage]
  VALIDATION = WELL_FORMED_XML;

CREATE CONTRACT [//DB/Schema/Contract](
  [//DB/Schema/RequestMessage] SENT BY INITIATOR,
  [//DB/Schema/ReplyMessage] SENT BY TARGET
)

CREATE QUEUE Schema.TargetQueue

CREATE SERVICE [//DB/Schema/TargetService]
ON QUEUE Schema.TargetQueue (
  [//DB/Schema/Method3Contract]
)

CREATE QUEUE Schema.InitiatorQueue

CREATE SERVICE [//DB/Schema/InitiatorService]
ON QUEUE Schema.InitiatorQueue

然后我有我的内部激活程序:

代码语言:javascript
复制
CREATE PROCEDURE Schema.Import
AS

DECLARE @RequestHandle UNIQUEIDENTIFIER;
DECLARE @RequestMessage VARCHAR(8);
DECLARE @RequestMessageName sysname;

WHILE (1=1)
BEGIN
  BEGIN TRANSACTION;

  WAITFOR (
    RECEIVE TOP(1)
      @RequestHandle = conversation_handle,
      @RequestMessage = message_body,
      @RequestMessageName = message_type_name
    FROM
      Schema.TargetQueue

  ), TIMEOUT 5000;


  IF (@@ROWCOUNT = 0)
  BEGIN
    COMMIT TRANSACTION;
    BREAK;
  END

  EXEC Schema.ImportStep1 @ID = @RequestMessage;
  --EXEC Schema.ImportStep2 @ID = @RequestMessage;

  END CONVERSATION @RequestHandle;

  COMMIT TRANSACTION;
END

我的激活是通过以下方式启用的:

代码语言:javascript
复制
ALTER QUEUE Schema.TargetQueue
    WITH 
    STATUS = ON,
    ACTIVATION 
    ( STATUS = ON,
      PROCEDURE_NAME = Schema.Import,
      MAX_QUEUE_READERS = 10,
      EXECUTE AS SELF
    )

我用这个存储过程启动这个进程。

代码语言:javascript
复制
CREATE PROCEDURE Schema.ImportStart
AS
BEGIN
  DECLARE @ID VARCHAR(8);

  DECLARE Cursor CURSOR FOR 
    SELECT ID FROM OtherDatabase.OtherSchema.ImportTable
    EXCEPT
    SELECT ID FROM Table

  OPEN Cursor;
  FETCH NEXT FROM Cursor INTO @ID;
  WHILE @@FETCH_STATUS = 0
  BEGIN
    DECLARE @InitiateHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMessage VARCHAR(8);

    BEGIN TRANSACTION;

    BEGIN DIALOG
      @InitiateHandle
    FROM SERVICE
      [//DB/Schema/InitiatorService]
    TO SERVICE
      N'//DB/Schema/TargetService'
    ON CONTRACT
      [//DB/Schema/Contract]
    WITH
      ENCRYPTION = OFF;

    SELECT @RequestMessage = @ID;

    SEND ON CONVERSATION
      @InitiateHandle
    MESSAGE TYPE
      [//DB/Schema/RequestMessage]
      (@RequestMessage);

    COMMIT TRANSACTION;

    FETCH NEXT FROM Cursor INTO @ID;
  END
  CLOSE Cursor;
  DEALLOCATE Cursor;
END

因此,这应该如何运作:

  • 我执行ImportStart
  • 生成每个ID的消息
  • 内部激活使导入步骤执行

相反,我会收到有害消息,队列就会被禁用。

但是如果,

  • 我.我把Schema.TargetQue激活关闭了
  • EXEC schema.ImportStart
  • 手动执行schema.Import

效果很好。

有人有洞见吗?

EN

回答 1

Stack Overflow用户

发布于 2015-09-15 01:03:55

嗯:

  • 您的消息类型被定义为well_formed_xml,但是您将varchar(8)作为消息体发送。真的有用吗?
  • 对目标队列使用[//DB/Schema/Method3Contract],但不定义它。很可能是拼写错误。
  • 在队列激活中指定EXECUTE AS SELF。波尔对这个案子说了些神秘的话:赛尔夫 指定存储过程以当前用户的身份执行。(执行此ALTER语句的数据库主体。)

我不太清楚我是否理解这句话,因为它显然与你的经验相矛盾。如果它是您的用户帐户,那么一切都应该是正常的,因为您似乎拥有完成该工作所必需的所有权限。

那么,以防万一-谁是Schema模式的所有者?这个主体拥有什么权限?如果不是您,那么执行alter queue语句的是谁(以及为什么)?

如果没有对日志的访问,诊断问题要困难得多,但我首先要创建一个具有与您的权限相同的新用户帐户,将其设置为Schema模式的所有者,然后缓慢地进行处理,撤销不必要的权限,直到它崩溃。当然,假设它会起作用的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32573250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档