j'essaie d'effectuer une opération INSERT
sur un serveur lié:
DBCC TRACEON (3604, 7300)
BEGIN TRANSACTION
INSERT INTO LIVE.Contoso.dbo.Events (EventGUID, EventDate, LoginGUID, UserGUID, EventType, Notes, TargetGUID)
VALUES ('{494D023F-CD5A-11E2-9F18-C86000D0B92A}', getdate(), '{3B4F90C0-CD5A-11E2-9F18-C86000D0B92A}', '{494D023D-CD5A-11E2-9F18-C86000D0B92A}', 1, N'Test notes', '{494D023E-CD5A-11E2-9F18-C86000D0B92A}')
ROLLBACK TRANSACTION
et il renvoie l'erreur:
OLE DB Fournisseur "SQLNCLI" pour serveur lié "LIVE" Message renvoyé "ne peut pas commencer plus de transactions à cette session.".
[.____] MSG 7395, niveau 16, État 2, ligne 3
Impossible de démarrer une transaction imbriquée pour OLE DB Fournisseur "SQLNCLI" pour serveur lié "Live". Une transaction imbriquée était nécessaire car l'option Xact_Abort a été définie sur OFF.
Cette base de données locale a été déplacée de 2000 (où les requêtes travaillaient) à 2005 (où intervient sans travail). Le serveur distant est 2008 R2.
La liste exhaustive des choses de cette question que j'ai posée il y a deux ans .
--EXEC master.dbo.sp_dropserver @server = N'LIVE'
EXEC master.dbo.sp_addlinkedserver @server = N'LIVE', @srvproduct=N'', @provider=N'SQLOLEDB', @datasrc=N'vader'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LIVE', @locallogin = NULL, @useself = N'False', @rmtuser = N'Contoso', @rmtpassword = N'Battery Horse Staple Correct'
j'ai désactivé toutes les options de sécurité MSDTC sur les deux serveurs
vérifié que les horloges sont en synchronisation (qui pour une raison inconnue brisera divers systèmes d'authentification si elles sont hors de synchronisation)
j'ai désactivé des pare-feu sur les deux serveurs (pas d'écran; vous devrez simplement me faire confiance)
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
De la documentation de SET XACT_ABORT
:
Xact_Abort doit être défini sur des instructions de modification de données dans une transaction implicite ou explicite contre la plupart OLE DB fournisseurs, y compris SQL Server. Le seul cas où cette option n'est pas requise est si le fournisseur prend en charge les transactions imbriquées . "
Peut-être utilisiez-vous un fournisseur qui appuyait des transactions imbriquées en 2000. Semblait que vous devez définir XACT_ABORT
. Je ne sais pas si cela convient à ce que votre code de production fait cependant.
Cette réponse peut aider: Quel est l'avantage d'utiliser "SET XACT_ABORT sur" dans une procédure stockée?