diff --git a/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php b/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php
index 84ac5ea46e6fe7fd3a6bd96a7c4ded35a724dad9..cbf3177b27669f4958ed14713d79f99879089357 100644
--- a/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php
+++ b/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php
@@ -10,6 +10,7 @@ use UnicaenDbImport\CodeGenerator\Helper\TableHelper;
 use UnicaenDbImport\CodeGenerator\Helper\TableValidationHelper;
 use UnicaenDbImport\Config\ConfigAwareTrait;
 use UnicaenDbImport\Domain\DestinationInterface;
+use UnicaenDbImport\Domain\Operation;
 use UnicaenDbImport\Domain\ResultInterface;
 use UnicaenDbImport\Domain\SourceInterface;
 
@@ -254,8 +255,8 @@ abstract class CodeGenerator implements CodeGeneratorInterface
     /**
      * @inheritDoc
      */
-    public function generateSQLForDestinationUpdateFromDiffViewRequestResult(
-        array $rows,
+    public function generateSQLForDestinationOperation(
+        $operation,
         SourceInterface $source,
         DestinationInterface $destination)
     {
@@ -264,12 +265,40 @@ abstract class CodeGenerator implements CodeGeneratorInterface
         $sourceCodeColumn = $source->getSourceCodeColumn();
         $columns = $source->getColumns();
 
-        return $this->tableHelper->generateSQLForOperationInDestinationTableFromDiffViewRequestResult(
-            $rows,
-            $destinationTable,
-            $sourceCodeColumn,
-            $columns,
-            $idColumnSequence);
+        // colonne ID écartée
+        $columns = array_diff($columns, ['ID', 'id']);
+
+        switch ($operation) {
+            case Operation::OPERATION_INSERT;
+                $sql = $this->tableHelper->generateSQLForInsertOperationInDestinationTable(
+                        $destinationTable,
+                        $sourceCodeColumn,
+                        $columns,
+                        $idColumnSequence);
+                break;
+            case Operation::OPERATION_UPDATE;
+                $sql = $this->tableHelper->generateSQLForUpdateOperationInDestinationTable(
+                        $destinationTable,
+                        $sourceCodeColumn,
+                        $columns);
+                break;
+            case Operation::OPERATION_DELETE;
+                $sql = $this->tableHelper->generateSQLForDeleteOperationInDestinationTable(
+                        $destinationTable,
+                        $sourceCodeColumn,
+                        $columns);
+                break;
+            case Operation::OPERATION_UNDELETE;
+                $sql = $this->tableHelper->generateSQLForUndeleteOperationInDestinationTable(
+                        $destinationTable,
+                        $sourceCodeColumn,
+                        $columns);
+                break;
+            default:
+                throw new RuntimeException("Opération inattendue");
+        }
+
+        return $sql . PHP_EOL;
     }
 
     /**
diff --git a/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php b/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php
index 7aea6da9c3fdbe8a02f615f175d5ec353c1de458..733f726e83ba524a0c2045bc6401025ecbfdc9e0 100644
--- a/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php
+++ b/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php
@@ -124,13 +124,13 @@ interface CodeGeneratorInterface
     public function generateSQLForDiffViewSelect(SourceInterface $source, DestinationInterface $destination);
 
     /**
-     * @param array                $rows
-     * @param SourceInterface      $source
+     * @param string $operation
+     * @param SourceInterface $source
      * @param DestinationInterface $destination
-     * @return string
+     * @return string[]
      */
-    public function generateSQLForDestinationUpdateFromDiffViewRequestResult(
-        array $rows,
+    public function generateSQLForDestinationOperation(
+        $operation,
         SourceInterface $source,
         DestinationInterface $destination);
 
diff --git a/src/UnicaenDbImport/CodeGenerator/Helper/LogTableHelper.php b/src/UnicaenDbImport/CodeGenerator/Helper/LogTableHelper.php
index 17269062ec0959f5ea2a5536c0a5b82e7c226ca8..bef564b9c50bb57f2be95ccb1b27dd1f1a0f7fc2 100644
--- a/src/UnicaenDbImport/CodeGenerator/Helper/LogTableHelper.php
+++ b/src/UnicaenDbImport/CodeGenerator/Helper/LogTableHelper.php
@@ -65,7 +65,7 @@ EOT;
                 throw new RuntimeException("Type de résultat inattendu");
                 break;
         }
-        $success = $result->getException() ? 0 : 1;
+        $success = $result->getFailure() ? 0 : 1;
         $startDate = $result->getStartDate()->format("Y-m-d H:i:s");
         $endDate = $result->getEndDate()->format("Y-m-d H:i:s");
 
diff --git a/src/UnicaenDbImport/CodeGenerator/Helper/TableHelper.php b/src/UnicaenDbImport/CodeGenerator/Helper/TableHelper.php
index 0f0e9339e45cee482b27c97c9a8479290743d815..8d09604da0c52b49be7c728bd6cb9ad5cbfff9ad 100644
--- a/src/UnicaenDbImport/CodeGenerator/Helper/TableHelper.php
+++ b/src/UnicaenDbImport/CodeGenerator/Helper/TableHelper.php
@@ -243,7 +243,7 @@ EOT;
      * @param string $sourceCodeColumn
      * @param string[] $columns
      * @param string|null|false $idColumnSequence
-     * @return string
+     * @return string[]
      */
     public function generateSQLForOperationInDestinationTableFromDiffViewRequestResult(
         array $rows,
@@ -272,16 +272,29 @@ EOT;
         foreach ($operations as $operation) {
             switch ($operation) {
                 case Operation::OPERATION_INSERT:
-                    $sqls[] = $this->generateSQLForInsertOperationInDestinationTable($destinationTable, $sourceCodeColumn, $columns, $idColumnSequence) . ';' . PHP_EOL;
+                    $sqls[] = $this->generateSQLForInsertOperationInDestinationTable(
+                        $destinationTable,
+                        $sourceCodeColumn,
+                        $columns,
+                        $idColumnSequence) . PHP_EOL;
                     break;
                 case Operation::OPERATION_UPDATE:
-                    $sqls[] = $this->generateSQLForUpdateOperationInDestinationTable($destinationTable, $sourceCodeColumn, $columns) . ';' . PHP_EOL;
+                    $sqls[] = $this->generateSQLForUpdateOperationInDestinationTable(
+                        $destinationTable,
+                        $sourceCodeColumn,
+                        $columns) . PHP_EOL;
                     break;
                 case Operation::OPERATION_UNDELETE:
-                    $sqls[] = $this->generateSQLForUndeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, $columns) . ';' . PHP_EOL;
+                    $sqls[] = $this->generateSQLForUndeleteOperationInDestinationTable(
+                        $destinationTable,
+                        $sourceCodeColumn,
+                        $columns) . PHP_EOL;
                     break;
                 case Operation::OPERATION_DELETE:
-                    $sqls[] = $this->generateSQLForDeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, $columns) . ';' . PHP_EOL;
+                    $sqls[] = $this->generateSQLForDeleteOperationInDestinationTable(
+                        $destinationTable,
+                        $sourceCodeColumn,
+                        $columns) . PHP_EOL;
                     break;
                 default:
                     throw new RuntimeException("Opération inconnue rencontrée : " . $operation);
@@ -289,7 +302,8 @@ EOT;
             }
         }
 
-        return empty($sqls) ? '' : implode(PHP_EOL, $sqls);
+//        return empty($sqls) ? '' : implode(PHP_EOL, $sqls);
+        return $sqls;
     }
 
     /**
@@ -363,7 +377,7 @@ EOT;
      * @param string|null|false $idColumnSequence
      * @return string
      */
-    protected function generateSQLForInsertOperationInDestinationTable(
+    public function generateSQLForInsertOperationInDestinationTable(
         $destinationTable,
         $sourceCodeColumn,
         array $columns,
@@ -502,7 +516,7 @@ EOT;
      * @param array $columns
      * @return string
      */
-    abstract protected function generateSQLForUpdateOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns);
+    abstract public function generateSQLForUpdateOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns);
 
     /**
      * @param string $destinationTable
@@ -510,7 +524,7 @@ EOT;
      * @param array $columns
      * @return string
      */
-    abstract protected function generateSQLForUndeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns);
+    abstract public function generateSQLForUndeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns);
 
     /**
      * @param string $destinationTable
@@ -518,5 +532,5 @@ EOT;
      * @param array $columns
      * @return string
      */
-    abstract protected function generateSQLForDeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns);
+    abstract public function generateSQLForDeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns);
 }
\ No newline at end of file
diff --git a/src/UnicaenDbImport/CodeGenerator/Oracle/CodeGenerator.php b/src/UnicaenDbImport/CodeGenerator/Oracle/CodeGenerator.php
index c41bad6bce9a41553f7625cb0723269b1ff809c2..abdd8a8dbd6cb84e602f3f96728476dd283a034e 100644
--- a/src/UnicaenDbImport/CodeGenerator/Oracle/CodeGenerator.php
+++ b/src/UnicaenDbImport/CodeGenerator/Oracle/CodeGenerator.php
@@ -3,8 +3,6 @@
 namespace UnicaenDbImport\CodeGenerator\Oracle;
 
 use UnicaenDbImport\CodeGenerator\Oracle;
-use UnicaenDbImport\Domain\DestinationInterface;
-use UnicaenDbImport\Domain\SourceInterface;
 use UnicaenDbImport\Platforms\OraclePlatform;
 
 /**
@@ -42,27 +40,6 @@ class CodeGenerator extends \UnicaenDbImport\CodeGenerator\CodeGenerator
             'END;';
     }
 
-    /**
-     * @inheritDoc
-     */
-    public function generateSQLForDestinationUpdateFromDiffViewRequestResult(
-        array $rows,
-        SourceInterface $source,
-        DestinationInterface $destination)
-    {
-        $sql = parent::generateSQLForDestinationUpdateFromDiffViewRequestResult($rows, $source, $destination);
-
-        if ($sql === '') {
-            return '';
-        }
-
-        // les ; séparant les INSERT/MERGE perturbent le driver Oracle donc on met ça dans un bloc BEGIN END et miracle...
-        return
-            'BEGIN ' . PHP_EOL .
-            $sql . PHP_EOL .
-            'END;';
-    }
-
     /**
      * @inheritDoc
      */
diff --git a/src/UnicaenDbImport/CodeGenerator/Oracle/Helper/TableHelper.php b/src/UnicaenDbImport/CodeGenerator/Oracle/Helper/TableHelper.php
index 30bfb24df377b79149075cb9322d35842d210c64..dbb8e6a7b13873a60ab4ae326fd49bbdb08befa7 100644
--- a/src/UnicaenDbImport/CodeGenerator/Oracle/Helper/TableHelper.php
+++ b/src/UnicaenDbImport/CodeGenerator/Oracle/Helper/TableHelper.php
@@ -80,7 +80,7 @@ class TableHelper extends \UnicaenDbImport\CodeGenerator\Helper\TableHelper
     /**
      * {@inheritDoc}
      */
-    protected function generateSQLForUpdateOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
+    public function generateSQLForUpdateOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
     {
         return $this->generateSQLUpdate(Operation::OPERATION_UPDATE, $destinationTable, $sourceCodeColumn, $columns);
     }
@@ -88,7 +88,7 @@ class TableHelper extends \UnicaenDbImport\CodeGenerator\Helper\TableHelper
     /**
      * {@inheritDoc}
      */
-    protected function generateSQLForUndeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
+    public function generateSQLForUndeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
     {
         return $this->generateSQLUpdate(Operation::OPERATION_UNDELETE, $destinationTable, $sourceCodeColumn, $columns);
     }
@@ -96,7 +96,7 @@ class TableHelper extends \UnicaenDbImport\CodeGenerator\Helper\TableHelper
     /**
      * {@inheritDoc}
      */
-    protected function generateSQLForDeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
+    public function generateSQLForDeleteOperationInDestinationTable($destinationTable, $sourceCodeColumn, array $columns)
     {
         return $this->generateSQLUpdate(Operation::OPERATION_DELETE, $destinationTable, $sourceCodeColumn, $columns);
     }
diff --git a/src/UnicaenDbImport/Controller/ConsoleController.php b/src/UnicaenDbImport/Controller/ConsoleController.php
index 9abb15325089f2f901462aad4481e243780f31c2..325c3b6e8120f71d301344865a4a2bb03eea3905 100644
--- a/src/UnicaenDbImport/Controller/ConsoleController.php
+++ b/src/UnicaenDbImport/Controller/ConsoleController.php
@@ -61,7 +61,7 @@ class ConsoleController extends AbstractConsoleController
 
             $result = $this->importService->runImport($import);
 
-            if ($exception = $result->getException()) {
+            if ($exception = $result->getFailure()) {
                 $this->getConsole()->writeLine("Une erreur a été rencontrée!", ColorInterface::RED);
                 $this->getConsole()->writeLine($exception->getMessage(), ColorInterface::RED);
                 if ($previous = $exception->getPrevious()) {
@@ -101,7 +101,7 @@ class ConsoleController extends AbstractConsoleController
 
             $result = $this->synchroService->runSynchro($synchro);
 
-            if ($exception = $result->getException()) {
+            if ($exception = $result->getFailure()) {
                 $this->getConsole()->writeLine("Une erreur a été rencontrée!", ColorInterface::RED);
                 $this->getConsole()->writeLine($exception->getMessage(), ColorInterface::RED);
                 if ($previous = $exception->getPrevious()) {
diff --git a/src/UnicaenDbImport/Domain/ImportResult.php b/src/UnicaenDbImport/Domain/ImportResult.php
index 6c988e2b261c766723eab530a40d0049a86ec08f..66a24a3e2a6e05adba24518f44821fd4bc79c1d5 100644
--- a/src/UnicaenDbImport/Domain/ImportResult.php
+++ b/src/UnicaenDbImport/Domain/ImportResult.php
@@ -14,11 +14,9 @@ class ImportResult extends Result
      */
     public function setDestinationTablePopulateResult($count)
     {
-        $data = [
-            'count'   => $count,
-            'details' => null,
-        ];
-        $this->setResultsForOperation($data, Operation::OPERATION_INSERT);
+        $this->setResultsByOperation([
+            Operation::OPERATION_INSERT => $count,
+        ]);
     }
 
     /**
diff --git a/src/UnicaenDbImport/Domain/Result.php b/src/UnicaenDbImport/Domain/Result.php
index ac4e118287199e364abc23bcac9b7b1c00daed2c..8f651afddf5552dc6ae1bf75801e93550aed154e 100644
--- a/src/UnicaenDbImport/Domain/Result.php
+++ b/src/UnicaenDbImport/Domain/Result.php
@@ -4,16 +4,17 @@ namespace UnicaenDbImport\Domain;
 
 use DateTime;
 use Exception;
+use UnicaenApp\Exception\RuntimeException;
 
 abstract class Result implements ResultInterface
 {
     /**
      * @var Exception
      */
-    private $exception;
+    private $failure;
 
     /**
-     * @var array
+     * @var array [operation => int|Exception]
      */
     private $resultsByOperation = [];
 
@@ -27,9 +28,21 @@ abstract class Result implements ResultInterface
      */
     private $endDate;
 
+    /**
+     * @param array $results
+     */
+    public function setResultsByOperation(array $results)
+    {
+        foreach ($results as $operation => $result) {
+            /** @var int|Exception $result */
+            $this->resultsByOperation[$operation] = $result;
+        }
+    }
+
     /**
      * @param array $data
      * @param string $operation
+     * @deprecated Le résultat pour une opération peut être une Exception !
      */
     public function setResultsForOperation(array $data, $operation)
     {
@@ -39,17 +52,17 @@ abstract class Result implements ResultInterface
     /**
      * @return Exception
      */
-    public function getException()
+    public function getFailure()
     {
-        return $this->exception;
+        return $this->failure;
     }
 
     /**
-     * @param Exception $exception
+     * @param Exception $failure
      */
-    public function setException(Exception $exception = null)
+    public function setFailure(Exception $failure = null)
     {
-        $this->exception = $exception;
+        $this->failure = $failure;
     }
 
     /**
@@ -90,7 +103,38 @@ abstract class Result implements ResultInterface
      */
     public function toString($includeDetails = false)
     {
-        if ($ex = $this->getException()) {
+        if (count($this->resultsByOperation) === 0) {
+            return "Aucune instruction exécutée.";
+        }
+
+        $str = '';
+        foreach ($this->resultsByOperation as $operation => $result) {
+            $str .= "# " . $operation . " : " . PHP_EOL;
+            if (is_array($result)) {
+                $str .= $result['count'] . " instructions exécutées.";
+            } elseif ($result instanceof Exception){
+                $str .= $result->getMessage();
+                if ($includeDetails) {
+                    $str .= PHP_EOL . $result->getTraceAsString();
+                }
+            } elseif (is_int($result)) {
+                $str .= $result . " enregistrement(s).";
+            } else {
+                throw new RuntimeException("Type de résultat spécifié inattendu : " . gettype($result));
+            }
+            $str .= PHP_EOL;
+        }
+
+        return $str;
+    }
+
+    /**
+     * @param bool $includeDetails
+     * @return string
+     */
+    public function toStringOld($includeDetails = false)
+    {
+        if ($ex = $this->getFailure()) {
             return $ex->getMessage() . PHP_EOL . $ex->getTraceAsString();
         }
 
diff --git a/src/UnicaenDbImport/Domain/ResultInterface.php b/src/UnicaenDbImport/Domain/ResultInterface.php
index ef564844ffe57b3e1b64e30cb766a7244faedc60..7b17f3354743aa4fc3c911d3f2e0540fe48eaa18 100644
--- a/src/UnicaenDbImport/Domain/ResultInterface.php
+++ b/src/UnicaenDbImport/Domain/ResultInterface.php
@@ -10,13 +10,13 @@ interface ResultInterface
     /**
      * @return Exception
      */
-    public function getException();
+    public function getFailure();
 
     /**
-     * @param Exception $exception
+     * @param Exception $failure
      * @return self
      */
-    public function setException(Exception $exception = null);
+    public function setFailure(Exception $failure = null);
 
     /**
      * @param DateTime $startDate
diff --git a/src/UnicaenDbImport/Domain/SynchroResult.php b/src/UnicaenDbImport/Domain/SynchroResult.php
index 0deb2499a815355d24e7f99148b4e28f1d7b8ce2..2a556b7df493aed7786df391e3e4b4b1c2574224 100644
--- a/src/UnicaenDbImport/Domain/SynchroResult.php
+++ b/src/UnicaenDbImport/Domain/SynchroResult.php
@@ -11,6 +11,7 @@ class SynchroResult extends Result
 
     /**
      * @param $rows
+     * @deprecated Ce n'est pas vraiment le résultat de la synchro !
      */
     public function setDiffViewRequestResult(array $rows)
     {
diff --git a/src/UnicaenDbImport/Service/DatabaseService.php b/src/UnicaenDbImport/Service/DatabaseService.php
index 88641ae7482e75dc27b3e127921ca71ab75ae1d4..3a744c58da49500a4ea8a4460d2027355c69b047 100644
--- a/src/UnicaenDbImport/Service/DatabaseService.php
+++ b/src/UnicaenDbImport/Service/DatabaseService.php
@@ -10,6 +10,7 @@ use Exception;
 use UnicaenApp\Exception\RuntimeException;
 use UnicaenDbImport\CodeGenerator\CodeGenerator;
 use UnicaenDbImport\Domain\DestinationInterface;
+use UnicaenDbImport\Domain\Operation;
 use UnicaenDbImport\Domain\ResultInterface;
 use UnicaenDbImport\Domain\SourceInterface;
 use UnicaenDbImport\Entity\Db\Service\ImportObserv\ImportObservServiceAwareTrait;
@@ -232,7 +233,11 @@ class DatabaseService
 
         // create table
         $sql = $this->codeGenerator->generateSQLForImportLogTableCreation($this->destination->getLogTable());
-        $this->queryExecutor->exec($sql, $connection);
+        try {
+            $this->queryExecutor->exec($sql, $connection);
+        } catch (DBALException $e) {
+            throw new RuntimeException("Erreur rencontrée lors de la création de la table de log", null, $e);
+        }
     }
 
     public function checkIntermediateTableNotExists($intermediateTable)
@@ -252,26 +257,38 @@ class DatabaseService
     {
         $sql = $this->codeGenerator->generateSQLForIntermediateTableCreation($this->source, $this->destination, $intermediateTable);
 
-        $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        try {
+            $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        } catch (DBALException $e) {
+            throw new RuntimeException("Erreur rencontrée lors de la création de la table intermédiaire", null, $e);
+        }
     }
 
     public function dropIntermediateTable($intermediateTable)
     {
         $sql = $this->codeGenerator->generateSQLForIntermmediateTableDrop($intermediateTable);
 
-        $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        try {
+            $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        } catch (DBALException $e) {
+            throw new RuntimeException("Erreur rencontrée lors de la suppression de la table intermédiaire", null, $e);
+        }
     }
 
     public function truncateDestinationTable()
     {
         $sql = $this->codeGenerator->generateSQLForClearTable($this->destination->getTable());
 
-        $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        try {
+            $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        } catch (DBALException $e) {
+            $tableName = $this->destination->getTable();
+            throw new RuntimeException("Erreur rencontrée lors du vidage de la table destination $tableName", null, $e);
+        }
     }
 
     /**
      * @return int
-     * @throws Exception
      */
     public function populateDestinationTableFromSource()
     {
@@ -308,9 +325,14 @@ class DatabaseService
         $insertsSQL = $this->codeGenerator->generateSQLForInsertIntoTable($tableName, $rows, $sourceCode, $idColumnSequence);
 
         // insert into destination
-        $this->queryExecutor->exec($insertsSQL, $this->destination->getConnection()); //Exécution de la requêtes (inserts) dans la base destination
+        try {
+            //Exécution de la requêtes (inserts) dans la base destination
+            $count = $this->queryExecutor->exec($insertsSQL, $this->destination->getConnection());
+        } catch (DBALException $e) {
+            throw new RuntimeException("Erreur rencontrée lors de l'écriture dans la table $tableName", null, $e);
+        }
 
-        return count($rows);
+        return $count;
     }
 
     private function prepareSourceDataForDestination(array $row)
@@ -334,7 +356,11 @@ class DatabaseService
             throw new RuntimeException("Erreur rencontrées lors de la création de la vue diff", null, $e);
         }
 
-        $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        try {
+            $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        } catch (DBALException $e) {
+            throw new RuntimeException("Erreur rencontrée lors de la création de la vue différentielle", null, $e);
+        }
     }
 
     /**
@@ -355,7 +381,11 @@ class DatabaseService
 
         if (!empty($importObservRows)) {
             $sql = $this->codeGenerator->generateSQLForInsertionIntoImportObservResult($importObservRows);
-            $this->queryExecutor->exec($sql, $this->destination->getConnection());
+            try {
+                $this->queryExecutor->exec($sql, $this->destination->getConnection());
+            } catch (DBALException $e) {
+                throw new RuntimeException("Erreur rencontrée lors de l'écriture dans la table IMPORT_OBSERV_RESULT", null, $e);
+            }
         }
     }
 
@@ -382,6 +412,57 @@ class DatabaseService
         }
     }
 
+    /**
+     * @return array [operation => int|Exception]
+     */
+    public function updateDestination()
+    {
+        $results = [];
+
+        $sql = $this->codeGenerator->generateSQLForDestinationOperation(
+            Operation::OPERATION_INSERT,
+            $this->source,
+            $this->destination
+        );
+        $results[Operation::OPERATION_INSERT] = $this->executeSql($sql);
+
+        $sql = $this->codeGenerator->generateSQLForDestinationOperation(
+            Operation::OPERATION_UPDATE,
+            $this->source,
+            $this->destination
+        );
+        $results[Operation::OPERATION_UPDATE] = $this->executeSql($sql);
+
+        $sql = $this->codeGenerator->generateSQLForDestinationOperation(
+            Operation::OPERATION_DELETE,
+            $this->source,
+            $this->destination
+        );
+        $results[Operation::OPERATION_DELETE] = $this->executeSql($sql);
+
+        $sql = $this->codeGenerator->generateSQLForDestinationOperation(
+            Operation::OPERATION_UNDELETE,
+            $this->source,
+            $this->destination
+        );
+        $results[Operation::OPERATION_UNDELETE] = $this->executeSql($sql);
+
+        return $results;
+    }
+
+    /**
+     * @param string $sql
+     * @return DBALException|int
+     */
+    private function executeSql($sql)
+    {
+        try {
+            return $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        } catch (DBALException $e) {
+            return $e;
+        }
+    }
+
     /**
      * Requête la Source pour obtenir les données sources.
      *
@@ -415,6 +496,10 @@ class DatabaseService
 
         $sql = $this->codeGenerator->generateSQLForInsertResultIntoLogTable($result, $importLogTable);
 
-        $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        try {
+            $this->queryExecutor->exec($sql, $this->destination->getConnection());
+        } catch (DBALException $e) {
+            throw new RuntimeException("Erreur rencontrée lors de l'écriture des logs dans la table $importLogTable", null, $e);
+        }
     }
 }
\ No newline at end of file
diff --git a/src/UnicaenDbImport/Service/FacadeService.php b/src/UnicaenDbImport/Service/FacadeService.php
index e9b8641e68bd5906a7e956a1340341d4ff4ad2aa..90c96551b8f57b51db23de5b1a83eb82f8632bae 100644
--- a/src/UnicaenDbImport/Service/FacadeService.php
+++ b/src/UnicaenDbImport/Service/FacadeService.php
@@ -3,14 +3,15 @@
 namespace UnicaenDbImport\Service;
 
 use Doctrine\DBAL\Connection as DbConnection;
-use Exception;
 use stdClass;
 use UnicaenApp\Exception\RuntimeException;
 use UnicaenDbImport\Connection\ApiConnection;
 use UnicaenDbImport\Domain\DestinationInterface;
 use UnicaenDbImport\Domain\Exception\ConnectionException;
+use UnicaenDbImport\Domain\ImportResult;
 use UnicaenDbImport\Domain\ResultInterface;
 use UnicaenDbImport\Domain\SourceInterface;
+use UnicaenDbImport\Domain\SynchroResult;
 use Zend\Log\Logger;
 use Zend\Log\LoggerInterface;
 use Zend\Log\Writer\Stream;
@@ -148,8 +149,7 @@ class FacadeService
     }
 
     /**
-     * @return int
-     * @throws Exception
+     * @return ImportResult
      */
     public function importToDestination()
     {
@@ -157,8 +157,12 @@ class FacadeService
 
         switch (true) {
             case $connection instanceof DbConnection:
-                return $this->databaseService->populateDestinationTableFromSource();
-                break;
+                $count = $this->databaseService->populateDestinationTableFromSource();
+
+                $result = new ImportResult();
+                $result->setDestinationTablePopulateResult($count);
+
+                return $result;
             default:
                 throw ConnectionException::unexpected($connection);
                 break;
@@ -166,7 +170,7 @@ class FacadeService
     }
 
     /**
-     * @return array
+     * @return SynchroResult
      */
     public function synchronizeDestination()
     {
@@ -187,14 +191,16 @@ class FacadeService
         if ($this->useImportObserv) {
             $this->databaseService->populateImportObservResultTable();
         }
-        $diffViewRequestResult = $this->databaseService->executeDiffViewSelectRequest();
-        $this->databaseService->updateDestinationFromDiffViewSelectRequestResult($diffViewRequestResult);
+        $resultsByOperation = $this->databaseService->updateDestination();
 
         if ($this->requiresIntermediateTable()) {
             $this->databaseService->dropIntermediateTable($intermediateTable);
         }
 
-        return $diffViewRequestResult;
+        $result = new SynchroResult();
+        $result->setResultsByOperation($resultsByOperation);
+
+        return $result;
     }
 
     /**
diff --git a/src/UnicaenDbImport/Service/ImportService.php b/src/UnicaenDbImport/Service/ImportService.php
index bd7e1117856965a7754b688378e8888394b5b607..3504b59ce3c33a68b337fcd894e4c0058e0372a8 100644
--- a/src/UnicaenDbImport/Service/ImportService.php
+++ b/src/UnicaenDbImport/Service/ImportService.php
@@ -2,7 +2,6 @@
 
 namespace UnicaenDbImport\Service;
 
-use Doctrine\DBAL\ConnectionException;
 use Exception;
 use UnicaenApp\Exception\RuntimeException;
 use UnicaenDbImport\Config\Config;
@@ -93,9 +92,6 @@ class ImportService
         $destination = $import->getDestination();
         $connection = $destination->getConnection();
 
-        $result = new ImportResult();
-        $result->setImport($import);
-
         $startDate = date_create('now');
 
         $this->facadeService->setSource($source);
@@ -108,19 +104,19 @@ class ImportService
 
             $connection->beginTransaction();
             $this->facadeService->clearDestination();
-            $count = $this->facadeService->importToDestination();
+            $result = $this->facadeService->importToDestination();
             try {
                 $connection->commit();
             } catch (Exception $e) {
                 $connection->rollBack();
-                throw new RuntimeException("Erreur rencontrée en base de données", null, $e);
+                throw new RuntimeException("Erreur rencontrée lors du commit en base de données", null, $e);
             }
-            $result->setDestinationTablePopulateResult($count);
-
         } catch (Exception $e) {
-            $result->setException($e);
+            $result = new ImportResult();
+            $result->setFailure($e);
         }
 
+        $result->setImport($import);
         $result->setStartDate($startDate);
         $result->setEndDate();
 
diff --git a/src/UnicaenDbImport/Service/SynchroService.php b/src/UnicaenDbImport/Service/SynchroService.php
index 69e5c0401563812b2fcaf86e6a0feeb5c5df40d7..1ee365ce3d125044eed1db7b8f55d980e7b5a9f4 100644
--- a/src/UnicaenDbImport/Service/SynchroService.php
+++ b/src/UnicaenDbImport/Service/SynchroService.php
@@ -92,9 +92,6 @@ class SynchroService
         $destination = $synchro->getDestination();
         $connection = $destination->getConnection();
 
-        $result = new SynchroResult();
-        $result->setSynchro($synchro);
-
         $this->facadeService->setSource($source);
         $this->facadeService->setDestination($destination);
 
@@ -102,6 +99,7 @@ class SynchroService
 
         $startDate = date_create('now');
 
+        $exception = null;
         try {
             $this->facadeService->createImportLog();
             $this->facadeService->validateDestination();
@@ -110,19 +108,18 @@ class SynchroService
 
             $connection->beginTransaction();
             try {
-                $diffViewRequestResult = $this->facadeService->synchronizeDestination();
+                $result = $this->facadeService->synchronizeDestination();
                 $connection->commit();
             } catch (Exception $e) {
                 $connection->rollBack();
                 throw new RuntimeException("Erreur rencontrée. Rollback effectué.", null, $e);
             }
-
-            $result->setDiffViewRequestResult($diffViewRequestResult);
-
         } catch (Exception $e) {
-            $result->setException($e);
+            $result = new SynchroResult();
+            $result->setFailure($e);
         }
 
+        $result->setSynchro($synchro);
         $result->setStartDate($startDate);
         $result->setEndDate();