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_queue
die 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).
- 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
- SQL Server Management Studio musste gestartet werden "Als Administrator" zu befestigen können Sie die Daten später. Dann Verband ich den SQL-Server.
- 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.
- 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der EXECUTE AS-Infrastruktur erfordert
dbo
für die Zuordnung zu einem gültigen login. Service Broker verwendet die EXECUTE AS-Infrastruktur, um die Nachrichten zu übermitteln. Ein typisches Szenario läuft in diesem problem ist ein Unternehmens-laptop, wenn Sie von zu Hause aus arbeiten. Anmeldung bei dem laptop mit zwischengespeicherte Anmeldeinformationen, und Sie log-in in die SQL mit der gleichen Windows zwischengespeicherte Anmeldeinformationen. Sie eineCREATE DATABASE
und diedbo
abgebildet werden, um Ihre corporate domain-Konto. Aber der EXECUTE AS-infratruktur nicht Verwendung der Windows-Cache-Konten, es erfordert eine direkte Anbindung an das Active Directory. Das nervtötende daran ist, dass die Dinge funktionieren für den nächsten Tag im Büro (Ihr laptop ist wieder in der corp-Netzwerk und kann Zugang zu den AD...). Sie gehen abends nach Hause, fahren Sie Fort mit Lektion 3... und plötzlich funktioniert es nicht mehr. Die ganze Sache scheint fadenscheinig und unzuverlässig. Nur die Tatsache, dass AD-conectivity benötigt wird...Anderen scenatio das führt zu dem gleichen problem wird durch die Tatsache verursacht, dass die Datenbanken reteint die SID von Ihrem Schöpfer (die Windows-Anmeldung, Probleme der
CREATE DATABASE
), wenn Sie wiederhergestellt oder befestigt werden. Wenn Sie ein lokales KontoPC1\Fred
beim erstellen der DB und kopieren Sie/fügen Sie die Datenbank auf PC2, das Konto ist ungültig auf PC2 (es bezieht sich auf PC1, natürlich). Wieder ist nicht viel betroffen, aber AUSFÜHREN WIE es ist, und dies bewirkt, dass Service Broker zu geben, die Fehler, die Sie sehen.Und letztes Beispiel ist, wenn die DB wird erstellt, indem ein Benutzer, der später das Unternehmen verlässt und das AD-Konto gelöscht wird. Scheint, wie die Rache von seinen Teil, aber er ist unschuldig. Die Produktions-DB einfach aufhört zu arbeiten, einfach weil es seine SID, die
dbo
Karten zu. Spaß...Einfach durch ändern der
dbo
zusa
Benutzernamen, mit dem Sie dieses Problem beheben insgesamt AUSFÜHREN ALS Ding und alle beweglichen Teile, die davon abhängen (und SSB ist wahrscheinlich die größte Abhängigkeit) zu arbeiten beginnen.InformationsquelleAutor der Antwort Remus Rusanu
Würden Sie erteilen möchten, erhalten Sie auf der Ziel-queue auf Ihre Anmeldung. Und es sollte funktionieren!
Und Sie müssen auch grant send-Anweisung für den Benutzer die Berechtigung auf der Ziel-Service sollte ausreichend sein, aber lassen Sie uns ermöglichen, auf beide Dienste für die Zukunft.
InformationsquelleAutor der Antwort Sergey