Frage

Ich versuche, ein Proof of Concept zu testen, dass ich eine verteilte Transaktion über zwei miteinander verbundene SQL-Server ausgeführt werden kann, verknüpft sp_addlinkedserver mit - ihre Namen sind Server1 und Server2, die beide unter Standardinstanzen ausgeführt wird. Jeder Server enthält eine einzelne Datenbank, Quelle und Ziel jeweils und die Zieldatenbank enthält einen einzigen Tabelle namens Output, das heißt.

Server1.Source
Server2.Destination.Output

Die OUTPUT-Tabelle hat die folgende Struktur:

OUT_PKEY int identity(1,1) primary key,
OUT_TEXT nvarchar(255)

Von Server1 Ich habe genannt sp_addlinkedserver ‚Server2‘ die beiden Datenbanken zu verknüpfen, und ich habe versucht, die folgende Abfrage ausführen zu testen, ob der Link funktioniert tatsächlich funktioniert:

Select   *
From     Server2.Destination.dbo.Output

Ich bin die folgende Ausnahme zurückgegeben:

  

Der Zugriff auf den Remote-Server verweigert wird, da kein Login-Mapping vorhanden ist.

Na gut, so von Server1, ich laufe sp_addlinkedsrvlogin ‚Server2‘ , die nach der Dokumentation sagt, dass sie die Anmeldeinformationen des Benutzers genommen werden sollten, wen auch immer remote auf die Abfrage ausgeführt wird (dh von Server1) und gelten diejenigen Anmeldeinformationen Server2. Dies bedeutet, dass, da ich verbunden ist zu Server1 Windows-Authentifizierung verwenden, soll dies bedeuten, dass meine Windows-Anmeldeinformationen zu Server2 angewandt werden auch.

Nun ist die Ausnahmemeldung Änderungen an:

  

Fehler bei der Anmeldung für den Benutzer 'NT AUTHORITY \ ANONYMOUS-Anmeldung'.

Diese Ausnahme gegoogelt habe, kam ich mit nichts nützlich, die mich in der richtigen Richtung. Was vermisse ich? Ich würde erwarten, [sollte die Anmeldung nicht überhaupt] die Ausnahme zu verweisen meine Windows-Credentials, nicht die anonymen Anmeldeinformationen.

Es sieht aus wie wenn ich den Link selbst arbeiten, sollten die verteilten Transaktionen selbst eine ziemlich einfache Angelegenheit sein - die Dokumentation impliziert, dass ich muss nur sicherstellen, dass der DTC-Dienst auf Server1 ausgeführt wird und dass alle Abfragen auf Server1 ausführen, wird über die Verbindung abgewickelt werden:

  • Fügen Sie SET XACT_ABORT ON vor der Initialisierung meiner verteilten Transaktion
  • Ich benutze BEGIN DISTRIBUTED TRANSACTION statt BEGIN TRANSACTION
  • Wenn ich eine Nicht-Standardinstanz von SQL Server auf Server2 referenzieren will, ersetze ich alle Instanzen des Namen Server2 in meiner Abfrage mit [Server2 \ InstanceName]

Meine Fragen sind diese:

  • Wie bekomme ich hinter diesem Login Problem? Das sp_addlinkedsrvlogin gespeicherte Prozedur allein nicht den Trick zu sein scheint tun.
  • Ist es tatsächlich so einfach wie das die verteilte Transaktion als die Dokumentation impliziert laufen?

TIA

War es hilfreich?

Lösung

Wenn Sie auf einer Domäne sind, dann sollte die Einstellung sein „gemacht werden, um die Anmeldung der aktuellen Sicherheitskontext verwenden“, aber es ist ein weiterer Schritt - Sie benötigen einen SPN jedem des Servers in der Transaktion beteiligt zu gewähren <. / p>

Angenommen, Sie die SQL-Dienste laufen auf beiden Servern als Domain-Benutzer (die Sie benötigen, um diese Arbeit zu machen - Local wird es nicht tun), hier sind die Anweisungen, die Sie benötigen:

http://technet.microsoft.com/en-us/library /bb735885.aspx

Beachten Sie, dass der Benutzer für beiden Server einen SPN benötigen, aber nicht die Client - zum Beispiel, wenn Sie von Client gehen werden -> server1 -> server2, das SQL-Dienstkonto wird ein SPN benötigt sowohl für server1 und server2.

Wenn Sie verwirrt (es ist eine verwirrende Prozess), schreiben Sie einen Kommentar und ich werde die Anweisungen klären.

Andere Tipps

Angenommen, sind diese Server beide auf der gleichen Domain - haben Sie die Delegierung vertraut aktiviert, damit der Server die Anmeldeinformationen an den Zielserver zu übergeben? Sie würden das Active Directory-Objekt für den Server hochziehen und auf die Registerkarte Delegierung gehen und wählen Sie „diesen Computer Vertrauen auf bestimmte Dienstleistungen für die Delegation nur“ und dann die SQL Server-Daten eingeben, dass die Server-Anmeldeinformationen erlaubt ist, passieren zu:

Service Type = MSSQLSvc
Benutzer / Computer = YourTargetServer.Your.Domain
Port = 1433

Leider viele dieser Arten von Authentifizierungsproblemen mit verknüpften Servern einen Neustart erfordern voll wirksam werden (so, wenn diese Produktionsserver es ist schwer, im Laufe des Tages zu beheben).

In Bezug auf verteilte Transaktionen - wenn Sie schließlich die Serververbindung verknüpft aufstehen und laufen korrekt funktionieren dann verteilte Transaktionen groß. Obwohl das nächste, was Sie wahrscheinlich in werde laufen, wenn Sie es arbeiten, um die großen Fehler findet , dass Sie keine Form von SCOPE_IDENTITY () verwenden können, @@ IDENTITY usw. Primärschlüssel abrufen nach etwas in einer verknüpften Datenbank einfügen. Aber das ist ein anderes Thema, mit seinen eigenen Spaß Abhilfen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top