in

UGISS Community

Il sito della community dello User Group Italiano di SQL Server

blocco delle tabelle con SSIS

Last post 07-20-2007 16.33 by angeladin. 12 replies.
Page 1 of 1 (13 items)
Sort Posts: Previous Next
  • 07-06-2007 10.57

    blocco delle tabelle con SSIS

    Salve,

    un fattore oscuro ancora per me è questo il lock sulle tabelle.

    finora ho consultato le tabelle per validare i dati prelevati dai fogli excel solo in lettura, adesso dovrei passare all'inserimento dei dati in tabelle molto delicate.

    Ho visto il codice realizzato per implementare i DTS da un mio collega per la mia stessa problematica, ha usato i cursori e le transazioni.

    Ad esempio:

    per ogni record di un dataset devo almeno inserire due record in tabelle diverse con id da ricavarsi e chiavi esterne per gestire le relazioni tra esse.
    Posso farlo con i blocchi forniti con SSIS, dandomi la sicurezza di poter annullare l'operazione compiuta come fosse un rollback o devo usare una funzione ad hoc come fa il mio collega?.

    C'è qualche opzione che blocca le tabelle? o qualche componente particolare che va in questa direzione?

    L'unico punto che ho sperimentato è che se il componente di inserimento ole db destination fallisce un solo inserimento è come se facesse rollback e tutto quello che aveva cercato si inserire fino a quel momento non c'è;

    ma in questo caso devo bloccare tabelle DIVERSE con un numero diverso di record da inserire e questo componente lavora solo su una tabella.

     



    ciao ciao da angela

    • Post Points: 20
  • 07-09-2007 10.36 In reply to

    Re: blocco delle tabelle con SSIS

    Semplifico il problema....

    se ad esempio ho una tabella in cui fare un update in funzione del valore che leggo nella stessa tabella,

    con i moduli SSIS posso stare tranquilla che se all'interno dello stesso blocco di dataflow

    un OLE DB source  esegue la select , un blocco di "Derived Column" lo modifica o direttamente poi un OLE DB Command esegue l'update

    nessun altro può accedere e modificare il dato tra queste due mie operazioni?

     

    Angy 

     

     

     

     

     

    • Post Points: 20
  • 07-10-2007 8.21 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: blocco delle tabelle con SSIS

    angeladin:

    Ho visto il codice realizzato per implementare i DTS da un mio collega per la mia stessa problematica, ha usato i cursori e le transazioni.

     Argh, i cursori noooooo Smile. Scherzi a parte è meglio non usarli: danno delle prestazioni pessime, in quanto costringono i database a lavorare riga per riga e non per set di dati, come invece sono ottimizzati per fare.

     

    angeladin:

    Posso farlo con i blocchi forniti con SSIS, dandomi la sicurezza di poter annullare l'operazione compiuta come fosse un rollback o devo usare una funzione ad hoc come fa il mio collega?.

     

    Certo che puoi, devi semplicemente abilitare le transazioni. (Per la cronoca anche nei DTS si può fare la stessa cosa.) 

    Devi semplicemente selezionare il Task "Data Flow" dal Control Flow e quindi nelle proprietà del task cercare la voce "Transaction Option" ed impostarla a "Required". Come vedrai nella voce "IsolationLevel" il livello di isolamento della transazione è Serializable, ossia il più alto, è quindi sei sicura che nessuno (a meno di esplicita richiesta) potrà accedere ai dati delle tabelle mentre li stai usando.

    Attenzione che per far funzionare correttamente il Microsoft Distributed Transaction Coordinator deve essere attivo su tutte le macchine che prendono parte alla transazione.

     

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 07-10-2007 8.26 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: blocco delle tabelle con SSIS

    angeladin:

    con i moduli SSIS posso stare tranquilla che se all'interno dello stesso blocco di dataflow un OLE DB source  esegue la select , un blocco di "Derived Column" lo modifica o direttamente poi un OLE DB Command esegue l'update nessun altro può accedere e modificare il dato tra queste due mie operazioni?

    Per stare tranquilla devi usare una transazione.
     

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 5
  • 07-10-2007 12.39 In reply to

    Re: blocco delle tabelle con SSIS

    proprio stamattina mi è caduto l'occhio sulle ultime due proprietà impostabili per i task.

    grazie per il consiglio. Wink

    ma a proposito di blocco ma non di tabelle, ma di variabili vorrei aggiornare una variabile in un processo del data flow e stavo cercando di farlo con uno script component.

    due domande:

    ---- c'è un altro modo per farlo

    ---- con uno script component mi dà problemi di accesso alla variabile, nonostante l'abbia dichiarata tra le ReadWriteVariables; inoltre la var è usata dopo nel control flow in un sql task(insert), ma ho impostato il connettore in funzione di una condizione e del completamento della precedente operazione.

    ciao ciao da angy

    • Post Points: 20
  • 07-11-2007 15.25 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: blocco delle tabelle con SSIS

    No, non c'è un altro modo per farlo.

    Ricordati che in uno Script Component le variabili sono accessibili solo nel metodo PostExecute. Devi quindi fare l'override di questo metodo e dal suo interno puoi quindi accedere alle varibili del Package:

    Public Overrides Sub PostExecute()
       Variables.MiaVariabile = 1234
    End Sub

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 07-19-2007 17.17 In reply to

    Huh? [:^)] Re: blocco delle tabelle con SSIS

    Salve,

    Ho Provato a fare come hai detto, ecco il codice implementato come se i fosse la variabile di un blocco for per ogni riga che analizza incrementa il valore di IdDev (inizializzato con un valore x) in questo modo in output ho per ogni record analizzato un id diverso, ma entro un certo range. durante l'esecuzione continua a dare un'eccezione. --------------------------------------"

    [Script Component [34]] Error: Microsoft.SqlServer.Dts.Pipeline.ReadWriteVariablesNotAvailableException: The collection of variables locked for read and write access is not available outside of PostExecute. at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.HandleUserException(Exception e) at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.PreExecute() at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper90 wrapper)

    "-------------------------------------

    Public Class ScriptMain

    Inherits UserComponent

    Dim inew As Integer

    Public Overrides Sub PreExecute()

    inew = Variables.i

    End Sub

    Public Overrides Sub PostExecute()

    Variables.i = inew

    End Sub

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    ' ' Add your code here ' '

    inew = Me.Variables.i

    Row.IdDev = Row.IdDev + inew

    inew = inew + 1

    End Sub

    End Class

    ________________________________________________________________________________________ 

    ciao ciao da angy

    • Post Points: 20
  • 07-20-2007 13.36 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: blocco delle tabelle con SSIS

    angeladin:

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    ' ' Add your code here ' '

    inew = Me.Variables.i

    Row.IdDev = Row.IdDev + inew

    inew = inew + 1

    End Sub

    End Class

    Il fatto che ti dia un errore è corretto, la riga  

    inew = Me.Variables.i

    deve essere rimossa dal metodo Input0_ProcessInputRow. Inoltre, se anche il codice che hai postato funzionasse correttamente, sicuramente non ti darebbe i risultati voluti in quanto per ogni riga processata avresti sempre lo stesso valore di "inew" visto che la riga

    inew = Me.Variables.i

    inizializza il contenuto di inew con lo stesso valore ad ogni interazione.

    Ricordati che:

    • il metodo PreExecute viene eseguito UNA VOLTA prima di iniziare l'esecuzione della trasformazione vera e propria
    • il metodo *_ProcessInputRow viene eseguito PER OGNI RIGA presente nel dataflow sulla quale il tuo script component opera
    • il metodo PostExecute viene eseguito UNA VOLTA al termine dell'esecuzione delle trasformazioni

    Klaro? Smile 

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 07-20-2007 14.49 In reply to

    Re: blocco delle tabelle con SSIS

    Tutto chiaro.

    l'istruzione  inew = Me.Variables.i dentro il metodo Input0_ProcessInputRow l'ho messa a commento, probabilmente nel copia incolla c'è stato un problema,

    ma da quello che mi dici in seguito su quando vengono eseguite le funzioni  PreExecute e PostExecute, allora non è come le avevo intese io.

    Non posso risolvere il mio problema, in questo modo. Per ora mi sono appoggiata ad una tabella temporanea, che scrive solo i dati

    NUMB # riga nel foglio excel,

    id = identity(0,1),

    iddef = id inizializzato al valore x per tutti i record

    id            NUMB   idDef

    0           

    21       33
    1
    25       33
    2
    26       33
    3
    36       33




    Poi aggiusto tutti i record incrementando il valore grazie al valore assunto dal campo id

    idDef = idDef + id;  con Derived column e butto il risultato direttamente nella tabella principale.

    la lascerò così.

    ma in compenso ho già un problema che risollevato dai miei moduli disabilitati, prossimamente su questo forum,

    anticipazione, riguarda il FileSystem Task

    ciao ciao da angy Cool

     

     

     

    • Post Points: 20
  • 07-20-2007 14.58 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: blocco delle tabelle con SSIS

    angeladin:
    Non posso risolvere il mio problema, in questo modo.
     

    magari mi sono perso per strada....ma il problema qual'è allora? Huh?

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 07-20-2007 15.44 In reply to

    Re: blocco delle tabelle con SSIS

    Con tutte le reply che ci sono ci si perde.

    le mie intenzioni era quelle di aggiornare il valore di una variabile riga per riga, ma se la variabile viene presa con il preexecute e poi al massimo aggiornata solo alla fine nnon mi serve, avrei bisogno di un contatore che per ogni riga del mio dataset incrementi il valore di iddef di un numero pari alle righe fino a quel momento analizzato.

    se stessi scrivendo codice c++

    (iddef = x  per ogni record)

     
    for int i = 0, i < num_righe_sel ; i++

    {

        iddef = iddef + i 

     ciaociao da angy

     

     

     

    • Post Points: 20
  • 07-20-2007 15.58 In reply to

    • dmauri
    • Top 10 Contributor
      Male
    • Joined on 05-14-2007
    • Novate Milanese
    • Posts 1.162
    • Points 15.190

    Re: blocco delle tabelle con SSIS

    Ok, mi sa che non sono stato chiaro Smile

    Le variabili DEL PACKAGE possono essere modificate SOLO nel PostExecute, ma le variabili locali (quelle dichiarate nello script, per intenderci) sono invece modificabli ovunque.

    Quindi puoi tranquillamente fare quello che chiedi.

    L'unica cosa alla quale bisogna prestare attenzione è l'utilizzo delle varibili del package e quindi esterne allo script componente, ossia quelle accedibili tramite l'oggetto Variables. Queste variabili possono essere modificate solo nel metodo PostExecute.

    Non ho ancora chiaro però quello che vuoi ottenere (funzionalmente parlando). Se stai cercando di avere una sorta di progess per avere informazioni sul numero di righe processate e mostrarlo e scriverlo in un log....questo non è il metodo corretto. Se vuoi comunicare all'utente quante righe sono state processate devi usare

    Event.FireInformation

    oppure

    Event.FireProgress

    Ciao!

    Davide Mauri
    Microsoft MVP - SQL Server, MCP, MCAD, MCDBA, MCT - http://www.davidemauri.it
    Socio Fondatore e Mentor di Solid Quality Learning Italy - http://www.solidq.com
    Presidente di UGISS: User Group Italiano Sql Server - http://www.ugiss.org
    • Post Points: 20
  • 07-20-2007 16.33 In reply to

    Re: blocco delle tabelle con SSIS

     come solito, mi stavo complicando la vita, ma il codice funzionante era lì davanti agli occhi, non mi serve il collegamento ad una variabile esterna, ma semplicemente

    Public Class ScriptMain
        Inherits UserComponent

        Dim inew As Integer

        Public Overrides Sub PreExecute()
            inew = 0
        End Sub

        Public Overrides Sub PostExecute()
            inew = 0
        End Sub

        Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
            '
            ' Add your code here
            '

            Row.IdDef = Row.IdDef + inew
            inew = inew + 1

        End Sub

    End Class

    l'ho già testato e funziona. Grazie mille per la pazienza.

    ciao ciao da angy 

    • Post Points: 5
Page 1 of 1 (13 items)
(C) 2007 User Group Italiano di SQL Server