Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [SQL SERVER 2K8] Trigger su linked server

    Buongiorno,

    ho una serie di Trigger che aggiornano dei dati attraverso un due server MS SQL collegati trà loro.

    Il tutto funziona con SQL Sqerver 2000 senza problemi.

    Adesso dobbiamo effettuare la migrazione alla nuova versione (la 2008 R2), ma questi trigger si rifiutano di funzionare, dando quest'errore:

    codice:
    Messaggio 3970, livello 16, stato 2, riga 1 Operazione non riuscita perché è in conflitto con un'altra operazione in sospeso sulla transazione.
    Sembra che il problema sia dato dal fatto che ci siano istruzione DMT seguite da istruzioni DDL.

    La cosa curiosa che questo problema è stato riscontrato (e risolto) in SQL SERVER 2005 con una fix, ma si segnalazioni (o risoluzioni) sul 2008 non ce ne sono.

    Riuscire ad aiutarmi?

    Il trigger è troppo lungo da postare, ma praticamente fa questo:
    [list=1][*]Seleziona i dati sulla tabella Inserted[*]disabilita il trigger nell'altro server[*]esegue l'aggionramento del dato nell'altro server[*]riabilita il trigger[/list=1]

    Grazie delle dritte

  2. #2
    Piccolo Update:

    nelle proprietà del linked server, quella chiamata "Attiva innalzamento di livello delle transazioni distribuite " di default è su true, se la sposto du false recupero della funzionalità.

    Niente di usabile comunque, il 50% delle transazioni mi falliscono e la cosa è stranissima!

  3. #3
    Altro Update:

    Sembra che l'esecuzione del codice non avvenga in modo sincrono.

    Praticamente c'è "appesa" un'operazione che blocca il comando successivo.

    C'è un modo per attendere che una transazione sia REALMENTE eseguita sul server per poi continuare a quella successiva?

    Ho provato a racchiudere tutto in "BEGIN TRAN - COMMIT TRAN" ma non subisce nessun'effetto praticolare.

    Grazie

  4. #4
    Altro Update:

    Ho modificato il codice (ovviamente utilizzando solo un tipo di istruzioni) e il tutto ha ripreso a funzionare.

    Questo è un esempio di codice non funzionante:

    codice:
    SELECT @DES_ART = DES_ART FROM INSERTED 
    EXEC SRVREMOTO.DBREMOTO.DBO.DISABLE_TRG ART_ANA,TRG_ART_ANA_UPD
    UPDATE SRVREMOTO.DBREMOTO.DBO.ART_ANA  SET DES_ART = @DES_ART WHERE COD_ART=@COD_ART 
    EXEC SRVREMOTO.DBREMOTO.DBO.ENABLE_TRG ART_ANA,TRG_ART_ANA_UPD
    ... che modificato così funziona:

    codice:
    SELECT @DES_ART = DES_ART FROM INSERTED 
    EXEC SRVREMOTO.DBREMOTO.DBO.DISABLE_TRG ART_ANA,TRG_ART_ANA_UPD
    EXEC ('UPDATE SRVREMOTO.DBREMOTO.DBO.ART_ANA  SET DES_ART = '''+@DES_ART+''' WHERE COD_ART='''+@COD_ART+'''') AT SRVREMOTO
    EXEC SRVREMOTO.DBREMOTO.DBO.ENABLE_TRG ART_ANA,TRG_ART_ANA_UPD
    E' una soluzione, ma nel poco tempo a disposizione non è ampiamente fattibile.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.