SQL Server 2008 Service Broker-Lernprogramm - kann die Nachricht nicht empfangen (Ausnahme im Übertragungsstatus)

Bin ich zum lernen, wie der Service Broker von SQL Server 2008 R2. Wenn nach dem tutorial Abschließen einer Konversation in einer Einzelnen Datenbank. Nach der Lektion 1ich habe erfolgreich die Nachrichtentypen, den Vertrag, den Warteschlangen und Dienstleistungen. Nach der Lektion 2habe ich wohl die Nachricht gesendet hat. Jedoch, wenn Sie versuchen, die Nachricht erhalten, bekomme ich die NULL für die ReceivedRequestMsg statt der gesendeten Inhalte.

Beim Blick auf die sys.transmission_queuedie transmission_status für die Meldung sagt:

Ausnahmefehler beim enqueueing eine Nachricht in die target queue. Fehler: 15517, Zustand: 1. Nicht ausführen kann als der principal-Datenbank, weil die wichtigste "dbo" nicht existiert, wird diese Art der Prinzipal kann nicht imitiert werden, oder Sie haben nicht die Berechtigung.

Habe ich installiert SQL Server mithilfe der Windows-login-Informationen wie Mycomp\Petr. Ich bin mit dieser Anmeldung auch für den Unterricht.

Können Sie erraten, was ist das problem? Was sollte ich prüfen und oder einstellen damit es funktioniert?

Bearbeitet 2012/07/16: Für die Hilfe, das problem zu reproduzieren, hier ist was ich getan habe. Können Sie den Fehler reproduzieren, wenn Sie Folgen die nächsten Schritte?

Erstens, ich bin mit Windows 7 Enterprise SP1 und Microsoft SQL Server 2008 R2 Developer Edition-64-bit - (ver. 10.50.2500.0, Root-Verzeichnis befindet sich unter C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL_PRIKRYL05\MSSQL).

  1. Nach dem tutorial Ratschläge, die ich heruntergeladen habe, die AdventureWorks2008R2_Data.mdf-Probe-Datenbank und kopiert es in C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL_PRIKRYL05\MSSQL\DATA\AdventureWorks2008R2_Data.mdf
  2. SQL Server Management Studio musste gestartet werden "Als Administrator" zu befestigen können Sie die Daten später. Dann Verband ich den SQL-Server.
  3. Rechten Maustaste auf Datenbanken, Kontext Menü Anhängen..., Schaltfläche Hinzufügen..., wies auf AdventureWorks2008R2_Data.mdf + OK. Dann wählte die AdventureWorks2008R2_Log.ldf aus dem raster unten (wie berichtet Nicht gefunden), und drücken die Entfernen... - Schaltfläche. Nach dem drücken von OK, wird die Datenbank angehängt wurde und die AdventureWorks2008R2_log.LDF wurde automatisch erstellt.
  4. Den folgenden Abfragen verwendet wurden für die Suche "Service Broker aktiviert/deaktiviert", und für die Aktivierung (der Service Broker aktiviert wurde erfolgreich für die Datenbank):

USE master;
GO

SELECT name, is_broker_enabled FROM sys.databases;
GO

ALTER DATABASE AdventureWorks2008R2
      SET ENABLE_BROKER
      WITH ROLLBACK IMMEDIATE;
GO

SELECT name, is_broker_enabled FROM sys.databases;
GO
  • Dann, nach dem tutorial, die Abfragen in der folgenden, die ausgeführt wurden, erstellen Sie die Nachrichtentypen, den Vertrag, die Warteschlangen und die Dienstleistungen:

USE AdventureWorks2008R2;
GO

CREATE MESSAGE TYPE
       [//AWDB/1DBSample/RequestMessage]
       VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE
       [//AWDB/1DBSample/ReplyMessage]
       VALIDATION = WELL_FORMED_XML;
GO

CREATE CONTRACT [//AWDB/1DBSample/SampleContract]
      ([//AWDB/1DBSample/RequestMessage]
       SENT BY INITIATOR,
       [//AWDB/1DBSample/ReplyMessage]
       SENT BY TARGET
      );
GO

CREATE QUEUE TargetQueue1DB;

CREATE SERVICE
       [//AWDB/1DBSample/TargetService]
       ON QUEUE TargetQueue1DB
       ([//AWDB/1DBSample/SampleContract]);
GO

CREATE QUEUE InitiatorQueue1DB;

CREATE SERVICE
       [//AWDB/1DBSample/InitiatorService]
       ON QUEUE InitiatorQueue1DB;
GO

So weit, So gut.

  • Dann die folgenden Abfragen werden verwendet, um den Blick auf die Warteschlangen (jetzt leer, wenn verwendet):

USE AdventureWorks2008R2;
GO

SELECT * FROM InitiatorQueue1DB WITH (NOLOCK);
SELECT * FROM TargetQueue1DB WITH (NOLOCK);
SELECT * FROM sys.transmission_queue;
GO
  • Das problem äußert sich dann, wenn die Nachricht gesendet wird:

BEGIN TRANSACTION;

BEGIN DIALOG @InitDlgHandle
     FROM SERVICE
      [//AWDB/1DBSample/InitiatorService]
     TO SERVICE
      N'//AWDB/1DBSample/TargetService'
     ON CONTRACT
      [//AWDB/1DBSample/SampleContract]
     WITH
         ENCRYPTION = OFF;

SELECT @RequestMsg =
       N'<RequestMsg>Message for Target service.</RequestMsg>';

SEND ON CONVERSATION @InitDlgHandle
     MESSAGE TYPE 
     [//AWDB/1DBSample/RequestMessage]
     (@RequestMsg);

SELECT @RequestMsg AS SentRequestMsg;

COMMIT TRANSACTION;
GO  

Beim Blick auf die Warteschlangen, die Initiator... und die Target... - Warteschlangen leer sind, und die gesendete Nachricht kann gefunden werden in sys.transmission_queue mit der oben genannten Fehlermeldung über die transmission_status.

InformationsquelleAutor der Frage pepr | 2012-07-08

Schreibe einen Kommentar