Question

J'essaie de tester une preuve de concept selon laquelle je peux exécuter une transaction distribuée sur deux serveurs SQL liés, liés à l'aide de sp_addlinkedserver. Leurs noms sont Server1 et Server2, tous deux exécutés sous des instances par défaut. Chaque serveur contient une seule base de données, Source et Destination, respectivement, et la base de données de destination contient une seule table appelée Output, c.-à-d.

.
Server1.Source
Server2.Destination.Output

La table OUTPUT a la structure suivante:

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

Depuis Server1, j'ai appelé sp_addlinkedserver 'Server2' pour lier les deux bases de données et j'ai tenté d'exécuter la requête suivante pour vérifier que le lien fonctionnait bien:

Select   *
From     Server2.Destination.dbo.Output

L'exception suivante m'a été renvoyée:

  

L'accès au serveur distant est refusé car aucun mappage de connexion n'existe.

Très bien, à partir de Server1, j'exécute sp_addlinkedsrvlogin 'Server2' qui, selon la documentation, indique que les informations d'identification de l'utilisateur de celui qui exécute la requête à distance (c'est-à-dire de Server1) doivent être appliquées. informations d'identification à Server2. Cela signifie que, puisque je suis connecté à Server1 à l’aide de l’authentification Windows, mes informations d’identité Windows doivent également être appliquées à Server2.

Maintenant, le message d'exception devient:

  

Échec de la connexion pour l'utilisateur 'NT AUTHORITY \ ANONYMOUS LOGON'.

Ayant googlé cette exception, je n’ai rien trouvé d’utile qui m’aide à aller dans la bonne direction. Qu'est-ce que je rate? Je m'attends à ce que [si la connexion échoue du tout] l'exception à référencer mes informations d'identification Windows, pas les informations d'identification de connexion anonyme.

Il semble qu'une fois que le lien fonctionne, les transactions distribuées doivent être une affaire assez simple - la documentation implique que je dois simplement m'assurer que le service DTC est exécuté sur Server1 et que toutes les requêtes exécutées sur ce dernier sera traité sur le lien:

  • Inclure SET XACT_ABORT ON avant d'initialiser ma transaction distribuée
  • J'utilise BEGIN DISTRIBUTED TRANSACTION au lieu de BEGIN TRANSACTION
  • Si je souhaite référencer une instance non SQL par défaut de SQL Server sur Server2, je remplace toute instance du nom Server2 dans ma requête par [Server2 \ InstanceName]

Mes questions sont les suivantes:

  • comment puis-je résoudre le problème de connexion? La procédure sp_addlinkedsrvlogin ne semble pas suffire à elle seule.
  • C’est vraiment aussi simple que d’exécuter la transaction distribuée comme le suppose la documentation?

TIA

Était-ce utile?

La solution

Si vous êtes sur un domaine, le paramètre doit être "Être défini à l'aide du contexte de sécurité actuel du login", mais il reste une étape: vous devez accorder un SPN à chacun des serveurs impliqués dans la transaction.

En supposant que vous exécutiez les services SQL sur les deux serveurs en tant qu'utilisateur de domaine (ce dont vous aurez besoin pour que cela fonctionne - LocalSystem ne le fera pas), voici les instructions dont vous aurez besoin:

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

N'oubliez pas que l'utilisateur aura besoin d'un SPN pour les deux serveurs, mais pas le client - par exemple, si vous quittez le client - > serveur1 - > server2, le compte de service SQL aura besoin d'un SPN pour server1 et server2.

Si vous êtes confus (c'est un processus déroutant), postez un commentaire et je clarifierai les instructions.

Autres conseils

En supposant que ces serveurs appartiennent au même domaine, avez-vous activé la délégation sécurisée pour permettre à votre serveur de transmettre les informations d'identification au serveur ciblé? Pour extraire l'objet Active Directory du serveur, accédez à l'onglet Délégation, puis sélectionnez "Approuver cet ordinateur pour la délégation uniquement à des services spécifiques". puis entrez les détails du serveur SQL auxquels le serveur est autorisé à transmettre les informations d'identification:

Type de service = MSSQLSvc
Utilisateur / Ordinateur = YourTargetServer.Your.Domain

Port = 1433

Malheureusement, de nombreux problèmes d’authentification de ce type avec les serveurs liés nécessitent un redémarrage pour que les modifications soient prises en compte (il est donc difficile de résoudre les problèmes au cours de la journée.)

.

En ce qui concerne les transactions distribuées - si vous établissez et exécutez correctement la connexion au serveur lié, les transactions distribuées fonctionnent très bien. Bien que la prochaine chose que vous rencontrerez probablement une fois que vous l'aurez fonctionné, c'est de trouver l'énorme défaut que vous ne pouvez utiliser aucune forme de SCOPE_IDENTITY (), @@ IDENTITY, etc. pour récupérer des clés primaires après avoir inséré quelque chose dans une base de données liée. Mais c’est un autre problème avec ses propres solutions de contournement amusantes ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top