我正在经历有毒信息,我不知道为什么。
我的代理设置是这样的:
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
模式的所有者,然后慢慢地对其进行处理,撤销不必要的权限,直到它崩溃。当然,前提是它能正常工作。