j'essaie d'exécuter SQL sur un serveur lié, mais j'obtiens les erreurs.
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 faire en sorte que Microsoft privilégie la fonctionnalité à la sécurité?
Ou, au minimum, comment puis-je faire en sorte que deux SQL Severs se parlent?
(null)
)Ce que j'ai ont fait n'est pas pertinent, mais je le posterai quand même.
Assurez-vous que le service Distributed Transaction Coordinator
est exécuté sur les deux machines:
Désactivez toute la sécurité MSDTC sur les deux ordinateurs:
Activer des options aléatoires sur le serveur lié:
Maudit et juré.
Des choses écrasées.
Vérifié qu'une 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 son nom, le serveur de départ:
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é
Publié SET XACT_ABORT ON
avant d'émettre ma requête :
SET XACT_ABORT ON
GO
BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions
Attribué Everyone
Full Control
à :
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
sur les deux serveurs.
Trouvé, MSDTC sur le serveur distant était un clone du serveur local.
À partir du journal des événements d'application Windows:
Type d'événement: erreur
Source de l'événement: MSDTC
Catégorie d'événement: CM
ID d'événement: 4101
Date: 19/09/2011
Heure: 13:32:59
Utilisateur: N/A
Ordinateur: ASITESTSERVER
La description:Le MS DTC local a détecté que le MS DTC sur ASICMSTEST a la même identité unique que le MS .__ local. DTC. Cela signifie que les deux MS DTC ne seront pas en mesure de communiquer avec l'un l'autre. Ce problème se produit généralement si l’un des systèmes ont été clonés à l’aide d’outils de clonage non pris en charge. MS DTC exige que le systèmes peuvent être clonés à l’aide d’outils de clonage pris en charge tels que SYSPREP . Exécutez 'msdtc -uninstall' puis 'msdtc -install' à partir de la commande Invite va résoudre le problème. Remarque: L'exécution de 'msdtc -uninstall' entraînera entraîner la perte de toutes les informations de configuration MS DTC.
Pour plus d'informations, voir Centre d'aide et de support à l'adresse http://go.Microsoft.com/fwlink/events.asp .
Fonctionnement
msdtc -uninstall
msdtc -install
puis l’arrêt et le redémarrage du service SQL Server l’a corrigé.
OK, les services sont démarrés, il existe un chemin Ethernet entre eux, la résolution de noms fonctionne, les serveurs liés fonctionnent et vous avez désactivé l'authentification de transaction.
Mon instinct dit problème de pare-feu, mais quelques choses me viennent à l'esprit ...
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 le DTC local.
Si votre serveur de destination se trouve sur un autre cloud ou centre de données, vous devez ajouter l'hôte-entrée du service MSDTC (serveur de destination) dans votre serveur source.
Essayez celui-ci si le problème n'est pas résolu, activez Après les paramètres MSDTC.
Outre les paramètres de sécurité, je devais ouvrir des ports sur les deux serveurs pour que la transaction soit exécutée. J'ai dû ouvrir le port 59640 mais, selon la suggestion suivante, le port 135 doit être ouvert . http://support.Microsoft.com/kb/839279
Ma dernière aventure avec MSDTC et cette erreur aujourd'hui se sont révélés être un problème de DNS. Vous êtes sur la bonne voie pour demander si les machines sont sur le même domaine, EBarr. Liste terrifiante 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 sur un serveur du domaine parent via un pare-feu. Au fil des années, j'ai utilisé pas mal de serveurs liés. Je disposais donc de tous les paramètres habituels en SQL pour un serveur lié et en MSDTC, que Ian avait si bien documentés. J'ai configuré MSDTC avec une plage de TCP ports (5000-5200) à utiliser sur les deux serveurs et organisé un trou de pare-feu entre les boîtiers des ports 1433 et 5000-5200. Cela aurait dû fonctionner. Le serveur lié a été testé correctement et j'ai pu interroger correctement le serveur SQL distant via le serveur lié, mais je ne pouvais pas le faire pour permettre une transaction distribuée. Je pouvais même voir une connexion sur le serveur d'assurance qualité à partir du serveur DEV, mais quelque chose ne faisait pas le voyage en arrière.
Je pourrais faire un ping sur le serveur DEV du contrôle qualité en utilisant un nom de domaine complet comme: PING DEVSQL.dev.domain.com
Je ne pouvais pas lancer une commande ping sur le serveur DEV uniquement avec le nom de la machine: PING DEVSQL
Le serveur DEVSQL était supposé être membre des deux domaines, mais le nom n'était pas résolu dans le DNS du domaine parent ... il était arrivé quelque chose au compte d'ordinateur de DEVSQL dans le domaine parent. Une fois que nous avons ajouté DEVSQL au DNS du domaine parent et que "PING DEVSQL" fonctionnait à partir du serveur QA distant, ce problème a été résolu pour nous.
J'espère que ça aide!