J'essaie d'exécuter SQL sur un serveur lié, mais j'obtiens les erreurs ci-dessous:
BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions
OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
Il y a deux erreurs renvoyées par le fournisseur:
Erreur n ° 1:
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile:
HelpContext: $00000000
SQLState: 01000
NativeError: 7412
Erreur n ° 2
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile:
HelpContext: $00000000
SQLState: 42000
NativeError: 7391
Comment amener Microsoft à privilégier la fonctionnalité par rapport à la sécurité?
Ou, du moins, comment puis-je faire en sorte que deux serveurs SQL se parlent?
Questions connexes
- L'opération n'a pas pu être effectuée car le fournisseur OLE DB «SQLNCLI10» ... (* le nom du serveur lié est
(null)
) - Erreur de transaction distribuée? (en utilisant le fournisseur Oracle )
- Impossible de s'inscrire dans une transaction distribuée avec NHibernate (en utilisant Hibernate )
- Erreur lors de l'utilisation de la transaction distribuée dans SQL Server 2008 R2 ( SQL Server 2008 R2, pas de réponse )
- Erreur de transaction distribuée uniquement via le code ( causée par le regroupement de connexions )
- Erreur lors de l'exécution du coordinateur de transactions distribuées dans le serveur lié ( SQL Server 2008, pas de réponse )
- Erreur de transaction distribuée? ( pas de réponse acceptée; seule la réponse n'aide pas )
- Comment insérer dans une table distante en utilisant un serveur lié sans transaction? (la réponse acceptée ne résout pas )
Ce que j'ai fait est hors de propos, mais je vais le poster de toute façon.
Assurez-vous que le
Distributed Transaction Coordinator
service fonctionne sur les deux machines:Désactivez toute la sécurité MSDTC sur les deux machines:
Activez les options aléatoires sur le serveur lié:
Maudit et juré.
Des choses brisées.
Vérifié qu'un
SELECT
peut utiliser le serveur lié :SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users .... (763 row(s) affected)
Vérifié que le serveur client peut
ping
le serveur distant :C:\Documents and Settings\avatar>ping asicmstest.contoso.com Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data: Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Reply from 10.0.0.40: bytes=32 time<1ms TTL=128 Ping statistics for 10.0.0.40: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
Vérifié que le serveur distant peut renvoyer, par nom, au serveur initiateur:
C:\Documents and Settings\avatar>ping asitestserver.contoso.com Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data: Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Reply from 10.0.0.22: bytes=32 time<1ms TTL=128 Ping statistics for 10.0.0.22: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
Vérifié que
@@SERVERNAME
correspond au nom du serveur sur les deux serveurs :SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ------------- ------------- ASITESTSERVER ASITESTSERVER
et
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName') ---------- ---------- ASIGROBTEST ASIGROBTEST
Crié
Émis
SET XACT_ABORT ON
avant d'émettre ma requête :SET XACT_ABORT ON GO BEGIN DISTRIBUTED TRANSACTION SELECT TOP 1 * FROM Sessions
Accordé
Everyone
Full Control
à :HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
sur les deux serveurs.
Réponses:
Je l'ai trouvé, MSDTC sur le serveur distant était un clone du serveur local.
À partir du journal des événements d'application Windows:
Fonctionnement
puis l'arrêt et le redémarrage du service SQL Server l'ont corrigé.
la source
J'ai pu résoudre ce problème (comme d'autres l'ont mentionné dans les commentaires) en désactivant "Activer la promotion des transactions distribuées pour RPC" (c'est-à-dire en le définissant sur
False
):la source
OK, donc les services sont démarrés, il y a un chemin Ethernet entre eux, la résolution de nom fonctionne, les serveurs liés fonctionnent et vous avez désactivé l'authentification des transactions.
Mon instinct dit problème de pare-feu, mais certaines choses me viennent à l'esprit ...
la source
Si les serveurs sont en cluster et qu'il existe un DTC en cluster, vous devez désactiver la sécurité sur le DTC en cluster et non sur le DTC local.
la source
Si votre serveur de destination se trouve sur un autre cloud ou centre de données, vous devez alors ajouter une entrée d'hôte du service MSDTC (serveur de destination) dans votre serveur source.
Essayez celui-ci si le problème n'est pas résolu, après avoir activé les paramètres MSDTC.
la source
Pour moi, cela concerne le réglage du pare-feu. Accédez aux paramètres de votre pare-feu, autorisez le service DTC et cela a fonctionné.
la source
Ma dernière aventure avec MSDTC et cette erreur aujourd'hui se sont avérées être un problème DNS. Vous êtes sur la bonne voie en demandant si les machines sont sur le même domaine, EBarr. Excellente liste pour ce numéro, au fait!
Ma situation: j'avais besoin d'un serveur dans un domaine enfant pour pouvoir exécuter des transactions distribuées contre un serveur du domaine parent via un pare-feu. J'ai utilisé un peu de serveurs liés au fil des ans, donc j'avais tous les paramètres habituels dans SQL pour un serveur lié et dans MSDTC que Ian a si bien documenté ci-dessus. J'ai mis en place MSDTC avec une gamme de ports TCP (5000-5200) à utiliser sur les deux serveurs, et organisé un trou de pare-feu entre les boîtes pour les ports 1433 et 5000-5200. Cela aurait dû marcher. Le serveur lié a testé OK et j'ai pu interroger le serveur SQL distant via le serveur lié, mais je ne pouvais pas l'obtenir pour permettre une transaction distribuée. Je pouvais même voir une connexion sur le serveur QA du serveur DEV, mais quelque chose ne faisait pas le voyage en arrière.
Je pourrais PING le serveur DEV de QA en utilisant un FQDN comme: PING DEVSQL.dev.domain.com
Je ne pouvais pas PING le serveur DEV avec juste le nom de la machine: PING DEVSQL
Le serveur DEVSQL était censé être membre des deux domaines, mais le nom ne se résolvait pas dans le DNS du domaine parent ... quelque chose était arrivé au compte machine pour DEVSQL dans le domaine parent. Une fois que nous avons ajouté DEVSQL au DNS pour le domaine parent et que "PING DEVSQL" a fonctionné à partir du serveur QA distant, ce problème a été résolu pour nous.
J'espère que ça aide!
la source
Outre les paramètres de sécurité, j'ai dû ouvrir certains ports sur les deux serveurs pour que la transaction s'exécute. J'ai dû ouvrir le port 59640 mais selon la suggestion suivante, le port 135 doit être ouvert. http://support.microsoft.com/kb/839279
la source
J'obtenais la même erreur et j'ai réussi à la résoudre en configurant correctement le MSDTC sur le serveur source pour autoriser les sorties et autoriser le DTC à travers le pare-feu Windows.
Autoriser le coordinateur de transactions distribuées, cocher le domaine, les options privées et publiques
la source