In questo mio
post, definivo le caratteristiche dei checkpoint ed un'introduzione alla funzionalità di SSIS.
Vi sono casi particolari, come quello indicato in questo
thread su microsoft.public.it.sql, che necessitano di alcuni workaround per portare dalla propria parte lo svantaggio che il For each Loop container ha con i checkpoint
. Nel
thread
indicato, vi è una semplice richiesta. Ottenere un Sequence container
che, in caso di errore, non rispetti le semplici condizioni di
checkpoint e che quindi si riavvii per intero. Comportandosi
naturalmente, al contrario, il task che ha generato l'errore
all'interno del contenitore è quello che verrà eseguito per primo al
riavvio, ignorando i precedenti.
Il workaround è semplice:
- impostare la proprietà FailPackageOnFailure a false in TUTTI i task interni ai sequence container
- Aggiungere in ogni sequence container un Foreach Loop container
- Impostare il Foreach Loop container con l'enumeratore "Item"
- Aggiungere sotto una colonna di tipo intero ad esempio (un item con un qualunque valore)
- Impostare la proprietà FailPackageOnFailure del Foreach Loop a true
- Spostare tutti i task che erano nel sequence container all'interno del Foreach Loop container
- Impostare la proprietà FailParentOnFailure di ogni task (di primo livello) interno al Loop a true
- Imposta la proprietà CheckpointUsage del package a IfExists e la FailPackageOnFailure del package a false (con CheckpointFileName = "path/file.chk" e SaveCheckpoints = true)
La chiave è quella di sfruttare al meglio lo svantaggio del foreach
In materia di checkpoint (e non solo), consiglio un
video di
Brian Knight, su
jumpstartTV. Non fatevi ingannare dalla signora prima del video di Brian, è solo pubblicità; non c'entra con SQL Server
Stay tuned!