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.