J'ai une table appelée MyTable
sur laquelle j'ai défini un déclencheur, comme ceci:
CREATE TRIGGER dbo.trg_Ins_MyTable
ON dbo.MyTable
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
insert SomeLinkedSrv.Catalog.dbo.OtherTable
(MyTableId, IsProcessing, ModifiedOn)
values (-1, 0, GETUTCDATE())
END
GO
Chaque fois que j'essaie d'insérer une ligne dans MyTable
, le message d'erreur suivant s'affiche:
Msg 3910, Niveau 16, Etat 2, Ligne 1 Contexte de transaction utilisé par une autre session.
J'ai SomeLinkedSrv
correctement défini en tant que serveur lié (par exemple, select * from SomeLinkedSrv.Catalog.dbo.OtherTable
fonctionne très bien).
Comment puis-je éviter l'erreur et insérer avec succès record + execute le déclencheur?
Les serveurs liés en boucle ne peuvent pas être utilisés dans une transaction distribuée si MARS est activé.
Les serveurs liés en boucle ne peuvent pas être utilisés dans une transaction distribuée. Essayer une requête distribuée sur un serveur lié en boucle depuis Dans une transaction distribuée provoque une erreur, telle que l'erreur 3910: " [Microsoft] [Pilote ODBC SQL Server] [SQL Server] Le contexte de la transaction dans Est utilisé par une autre session. " Cette restriction ne s'applique pas lorsqu'une instruction INSERT ... EXECUTE, émise par une connexion sur laquelle ne dispose pas de plusieurs jeux de résultats actifs (MARS), s'exécute avec une boucle de rappel . serveur lié. Notez que la restriction s'applique toujours lorsque MARS est activé sur une connexion.
http://msdn.Microsoft.com/en-us/library/ms188716(SQL.105).aspx
Je le résous. J'utilisais le même serveur lié pour appeler la deuxième procédure, puis j'utilisais le même serveur lié.
C'est très facile, il suffit de connaître les restrictions des serveurs liés.
Lorsque la base de données distante se trouve sur le même serveur, configurez le serveur lié sans spécifier l'adresse IP/nom d'hôte et le port du serveur de base de données. Le nom de la base de données devrait suffire.
Dans mon cas, j’utilisais SQL 2005 et j’ai eu le "contexte de transaction utilisé par une autre session" lors de l’exécution de Insert .... exec sur un serveur lié. Pour moi, le correctif consistait à installer un correctif de SP2 build 3161 à SP3. Le SP2 cumulatif 5 est censé réparer cependant.
J'ai également eu la même erreur dans notre environnement DEV, le déplacement des bases de données liées vers une autre instance SQL a résolu le problème. Dans notre environnement de production, ces bases de données sont déjà sur des instances séparées
Je l'ai résolu en supprimant le serveur lié utilisé dans la procédure stockée, puis appelé procédure stockée par le même serveur lié. Cela ne fonctionnait pas dans l'environnement DEV.