服务代理内部激活中毒-哪里



我正在经历有毒信息,我不知道为什么。

我的代理设置是这样的:

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

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

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

我的激活是通过:

ALTER QUEUE Schema.TargetQueue
    WITH 
    STATUS = ON,
    ACTIVATION 
    ( STATUS = ON,
      PROCEDURE_NAME = Schema.Import,
      MAX_QUEUE_READERS = 10,
      EXECUTE AS SELF
    )

我用这个存储过程

启动这个过程
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生成一条消息
  • 内部激活使导入步骤执行

相反,我得到有毒消息,队列被禁用。

但是,

  • I设置Schema。TargetQue激活到OFF
  • EXEC模式。ImportStart
  • EXEC模式。手动导入

工作正常

谁有什么见解?

嗯:

  • 您的消息类型定义为well_formed_xml,但您发送的varchar(8)作为消息体。它真的有效吗?
  • 您使用[//DB/Schema/Method3Contract]作为目标队列,但不定义它。很可能是拼写错误。
  • 在队列激活中指定EXECUTE AS SELF。BOL说了一些关于这个案子的神秘之处

    自我
    指定存储过程作为当前用户执行。(执行ALTER QUEUE语句的数据库主体)

我不太确定我理解引用的说法,因为它显然与你的经验相矛盾。如果这是你的用户帐户,一切都应该没问题,因为你似乎有做这项工作所需的所有权限。

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

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

最新更新