none
Trigger per insert into su mysql linked server - Errore 3609 RRS feed

  • Domanda

  • Ciao a tutti,

    ho un sql server express 2012 sp2 e un mysql  come server collegato come indicato da diverse guide su internet

    Quando inserisco un articolo vorrei inserirlo automaticamente nel db mysql. Ho guardato su diversi siti ma non ho capito cosa non stia funzionando. Il codice viene scritto su mysql ma si genera l'errore Error: SqlException: 3609  -  The transaction ended in the trigger. The batch has been aborted.  Error number: -2146232060

    Allego il mio trigger:

    CREATE TRIGGER [dbo].[INSERTMYSQL]
    ON [dbo].[articoli_temp]
    INSTEAD OF  INSERT
    AS
    BEGIN
     COMMIT TRANSACTION
     SET XACT_ABORT ON
     DECLARE @codice varchar(50)
     select @codice=(SELECT codart from inserted)
     insert into openquery(miodb,'select campo1 from miodb.art') values (@codice)

    Preferirei la soluzione definitiva, altrimenti non ci sarebbe un modo per "nascondere" l'errore?

    Grazie


    martedì 15 luglio 2014 15:39

Tutte le risposte

  • Buongiorno Fv81,

    dovrebbe esserti sufficiente eliminare la riga "COMMIT TRANSACTION", che in effetti richiede al server di eseguire una transazione che, in quel punto, non è stata dichiarata.

    Prova con l'eliminazione della riga (dai miei test è sufficiente), lasciando intatto il resto del codice.


    Emiliano Musso

    mercoledì 16 luglio 2014 07:33
  • Ti ringrazio per la risposta, ma avevo aggiunto la commit transaction perché senza non solo genera questo errore ma non scrive neanche il record su mysql.

    Error:

    SqlException: 7391  -  The operation could not be performed because OLE DB provider "MSDASQL" for linked server "MIODB" was unable to begin a distributed transaction.
    OLE DB provider "MSDASQL" for linked server "MIODB" returned message "[MySQL][ODBC 5.3(a) Driver]Optional feature not supported".  Error number: -2146232060

    mercoledì 16 luglio 2014 07:56
  • Aggiungo che all'interno di un trigger noi siamo in regime di "Autocommit transactions": nel senso che l'operazione di insert è implicitamente in regime transazionale e quindi non ha senso definire un begin o un commit transaction al suo interno.
    mercoledì 16 luglio 2014 07:59
  • Se il discorso transazionale è obbligatorio, credo allora sia opportuno racchiudere tutto il blocco di istruzioni tra i predicati che identificano inizio e fine transazione, in questo modo

    ALTER TRIGGER [dbo].[InsertArticolo]
       ON  [dbo].[Test]
       INSTEAD OF INSERT
    AS 
    BEGIN
        SET NOCOUNT ON;
    
        BEGIN TRANSACTION
        
        SET XACT_ABORT ON
        DECLARE @codice varchar(50)
        select @codice=(SELECT codart from inserted)
        insert into TEST_VARI.dbo.test2 (codart) values (@codice)
    
        COMMIT TRANSACTION
    END
    

    Il mio trigger è ovviamente differente dal tuo, ciò che conta è però il BEGIN/COMMIT. Non ho attuale possibilità di testare MySQL su SQL Server (come vedrai, il mio test è SQL Server su SQL Server), ma a livello di logica non dovrebbe cambiare.



    Emiliano Musso

    mercoledì 16 luglio 2014 08:07
  • Avevo letto quanto da voi riportato sui vari forum e dopo ore ero arrivato alla soluzione iniziale, anche perché ho fatto come proposto nell'ultimo post ma mi restituisce sempre. Ho guardato i parametri sia di MSDASQL e ODBC. Magari che sia qualcosa su mysql?

    SqlException: 7391  -  The operation could not be performed because OLE DB provider "MSDASQL" for linked server "MIODB" was unable to begin a distributed transaction.

    OLE DB provider "MSDASQL" for linked server "MIODB" returned message "[MySQL][ODBC 5.3(a) Driver]Optional feature not supported".  Error number: -2146232060

    mercoledì 16 luglio 2014 09:01
  • A questo punto proverei ancora a disabilitare la protezione legata all'esecuzione di procedure remote. Da SQL Server, prova ad eseguire questo comando

    sp_configure remote proc trans off

    riprovando quindi a lanciare nuovamente la tua procedura (ed eventualmente, dato il punto sollevato sopra da Fabio, rimuovendo i riferimenti alle transazioni, nel caso ricevessi ancora errori)


    Emiliano Musso

    mercoledì 16 luglio 2014 09:09
  • Mi sono preso del tempo per riprovare da zero tutto, ho seguito i vostri consigli, ma gli errori persistono.

    Ho provato anche a creare una stored procedure.

    Ovviamente se la eseguo funziona e non ricevo errori (come quando eseguivo la query da managemente), ma se la richiamo dal trigger si genera l'errore... Non so veramente come uscirne...

    Grazie

    giovedì 17 luglio 2014 08:03
  • Potresti provare ancora modificando il trigger per aggiungere un costrutto TRY-CATCH, per intercettazione l'errore (e non far accadere nulla quando viene riscontrato). 

    Per far questo dovrai rimuovere nuovamente il COMMIT TRANSACTION, e variare in questo modo:

    CREATE TRIGGER [dbo].[INSERTMYSQL]
    ON [dbo].[articoli_temp]
    INSTEAD OF  INSERT
    AS 
    BEGIN
        BEGIN TRY    
           SET XACT_ABORT ON
           DECLARE @codice varchar(50)
           select @codice=(SELECT codart from inserted)
           insert into openquery(miodb,'select campo1 from miodb.art') values (@codice)
        END TRY
        BEGIN CATCH
        END CATCH
    END

    Puoi verificare se è risolutivo?


    Emiliano Musso

    mercoledì 23 luglio 2014 15:44