J'essaie d'exécuter SQL sur un serveur lié, mais j'obtiens les erreurs suivantes :
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 retourné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 pour que Microsoft privilégie la fonctionnalité à la sécurité ?
Ou, au moins, comment puis-je faire en sorte que deux SQL Severs 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 par le code ( causés par la mise en commun des connexions )
- Erreur lors de l'exécution du coordinateur de transactions distribuées dans un serveur lié ( SQL Server 2008, pas de réponse )
- Erreur de transaction distribuée ? ( aucune réponse acceptée ; la seule réponse n'aide pas )
- Comment insérer dans une table distante en utilisant Linked Server sans transaction ? ( La réponse acceptée ne résout pas )
Ce que je ont fait n'est pas pertinent, mais je vais quand même le poster.
-
Assurer
Distributed Transaction Coordinator
Le service fonctionne sur les deux machines : -
Désactiver toute la sécurité MSDTC sur les deux machines :
-
Activez les options aléatoires sur le serveur lié :
-
Maudits et jurés.
-
Des choses cassé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 communiquer en retour, par son nom, avec le 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
-
Screamed
-
Délivré
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.
42 votes
C'est bien de voir que tu n'as pas sauté l'étape cruciale du "maudit et juré" !
13 votes
Hey, parfois les gens sont très particuliers pour que tu suives chaque Étape. Je ne voulais pas que quelqu'un dise que je n'avais pas essayé quelque chose.
7 votes
J'adore ce post. Il représente toutes les expériences que j'ai eues avec MSDTC.
5 votes
Dans mon cas, après avoir mis "Enable Promotion of Distributed Transactions for RPC" sur False sur le serveur lié, cela fonctionne. Essayez peut-être
4 votes
@HaiPhan Désactiver l'utilisation des transactions distribuées brise l'intégrité transnationale : si vous faites un rollback de vos modifications sur le serveur local, cela signifie que les modifications resteront en place sur le serveur distant. Très dangereux.