SQL Server Performance

Problem with linked server and nested transaction

Discussion in 'General DBA Questions' started by francki17, Jan 6, 2006.

  1. francki17 New Member

    Hi, I've got a problem when I try to update a row from a trigger in my table of a linked server. This is the context:<br /><br />A server named Server1 has my DB with my table to update.<br /><br />Another server named Server2 has another DB (security system of the building).<br /><br />Server1 is a linked server in Server2.<br /><br />Each time a reader reads an acces card, a row is updated in a table of Server2.<br /><br />My goal is simple: When an employee pass his acces card on a reader to enter to enter i the building, his presence status (Away, Busy, Not at office, At office, etc.) is automatically updated in my table<br /><br />So, I create a trigger on this table to detect each update and update the row (corresponding to the acces card's owner) in my table on Server1.<br /><br /><br /><br />This is the trgger trigger:<br />---------------------------------------------------------------<br />ALTER TRIGGER myTrigger<br />ON theTableOnServer2<br />AFTER UPDATE, INSERT<br />AS<br /><br />DECLARE @PersonID int<br /><br />IF UPDATE(TheFieldWhoShouldBeUpdated)<br />BEGIN<br /> -- Get the PersonID of the acces card's owner<br />SELECT TOP 1 @noPersonne = IDPersonne FROM INSERTED<br /> -- Update in my table the status of the acces card's owner<br />UPDATE Server1.MyDB1.dbo.myTable1 SET Server1.MyDB1.dbo.myTable1.statusID = 'At office' WHERE personID = @personID;<br />END<br />-----------------------------------------------------------------<br /><br />When I test the trigger, an error is launch ans this message appears<br /><br />Server: Msg 7395, Level 16, State 2, Procedure monTrigger, Line 14<br />Unable to start a nested transaction for OLE DB provider 'SQLOLEDB'. A nested transaction was required because the XACT_ABORT option was set to OFF.<br />[OLE/DB provider returned message: Cannot start more transactions on this session.]<br />OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionLocal:<img src='/community/emoticons/emotion-7.gif' alt=':S' />tartTransaction returned 0x8004d013: ISOLEVEL=4096].<br /><br /><br />I don't really know now what to do with this problem, so if someone has an idea or a solution, I would appreciate it.<br /><br />Francois<br /><br />Version Francaise/ French version -----<br /><br />Bonjour, j'ai un bogue lorsque je tente de mettre à jour une ligne dans une table d'un serveur lié à partir d'un trigger. Voici la situation:<br /><br />Un serveur nommé Serveur1 contient ma BD avec ma tables à mettre à jour.<br /><br />Un autre serveur nommé Serveur2 contient une autre BD (système de sécurité de l'édifice).<br /><br />Serveur1 est un serveur lié dans Serveur2.<br /><br />À chaque fois qu'un lecteur d'entrée lit une carte, une ligne est mise à jour dans une table de Serveur2.<br /><br />Mon but est simple: dès qu'un employé passe sa carte sur un lecteur d'entrée pour entrer dans le bâtiment, que son statut de présence soit automatiquement mis à "Au bureau" dans ma table.<br /><br />J'ai donc mis un trigger sur cette table pour qu'à chaque fois qu'une mise à jour est faite, que la ligne (correspondant au propriétaire de la carte) dans ma table sur Serveur1 soit mise à jour.<br /><br />Voici le code du trigger:<br />---------------------------------------------------------------<br />ALTER TRIGGER monTrigger<br />ON laTableSurServeur2<br />AFTER UPDATE, INSERT<br />AS<br /><br />DECLARE @noPersonne int<br /><br />IF UPDATE(LeChampQuiEstSupposéEtreMisAJourL)<br />BEGIN<br />-- Obtient l'ID du propriétaire de la carte<br />SELECT TOP 1 @noPersonne = IDPersonne FROM INSERTED<br />-- Met à jour dans ma table le statut du propriétaire de la carte<br />UPDATE Serveur1.MaBD1.dbo.maTable1 SET Serveur1.MaBD1.dbo.maTable1.statutNo = 'Au bureau' WHERE personneNo = @noPersonne;<br />END<br />-----------------------------------------------------------------<br />Lorsque je provoque une mise à jour, une erreur est lancée et ce message s'affiche:<br /><br />Server: Msg 7395, Level 16, State 2, Procedure monTrigger, Line 14<br />Unable to start a nested transaction for OLE DB provider 'SQLOLEDB'. A nested transaction was required because the XACT_ABORT option was set to OFF.<br />[OLE/DB provider returned message: Cannot start more transactions on this session.]<br />OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionLocal:<img src='/community/emoticons/emotion-7.gif' alt=':S' />tartTransaction returned 0x8004d013: ISOLEVEL=4096].<br /><br /><br />Je ne sais plus vraiment quoi faire avec ce bogue alors si quelqu'un a une idée ou encore mieux, une solution, elle serait grandement appréciée.<br /><br />François

Share This Page