我正经历着有害的信息,我不知道为什么。
我的代理设置如下所示:
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因此,这应该如何运作:
相反,我会收到有害消息,队列就会被禁用。
但是如果,
效果很好。
有人有洞见吗?
发布于 2015-09-15 01:03:55
嗯:
well_formed_xml,但是您将varchar(8)作为消息体发送。真的有用吗?[//DB/Schema/Method3Contract],但不定义它。很可能是拼写错误。EXECUTE AS SELF。波尔对这个案子说了些神秘的话:赛尔夫
指定存储过程以当前用户的身份执行。(执行此ALTER语句的数据库主体。)我不太清楚我是否理解这句话,因为它显然与你的经验相矛盾。如果它是您的用户帐户,那么一切都应该是正常的,因为您似乎拥有完成该工作所必需的所有权限。
那么,以防万一-谁是Schema模式的所有者?这个主体拥有什么权限?如果不是您,那么执行alter queue语句的是谁(以及为什么)?
如果没有对日志的访问,诊断问题要困难得多,但我首先要创建一个具有与您的权限相同的新用户帐户,将其设置为Schema模式的所有者,然后缓慢地进行处理,撤销不必要的权限,直到它崩溃。当然,假设它会起作用的话。
https://stackoverflow.com/questions/32573250
复制相似问题